/ Hex Artifact Content
Login

Artifact da24e8406f819dfce006c6eeba2da7a561a45de1:


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 41 64 64 47 6f 74 6f 28  ite3VdbeAddGoto(
5200: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
5210: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
5220: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
5230: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
5240: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5250: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5260: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5270: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
5280: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
5290: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
52a0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
52b0: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
52c0: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
52d0: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
52e0: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
52f0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
5300: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
5310: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
5320: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
5330: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
5340: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
5350: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
5360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
5370: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
5380: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
5390: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
53a0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
53b0: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
53c0: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
53d0: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
53e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
53f0: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
5400: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
5410: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
5420: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
5430: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
5440: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
5450: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
5460: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
5470: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
5480: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
5490: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
54a0: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
54b0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
54c0: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
54d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
54e0: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
54f0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
5500: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
5510: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
5520: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
5530: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5540: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5550: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5560: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5570: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
5580: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
5590: 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b  epeat, iMem, N);
55a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
55b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
55c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
55d0: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
55e0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
55f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5600: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
5610: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
5620: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5630: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
5640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5650: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
5660: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
5670: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
5680: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
5690: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
56a0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
56b0: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
56c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
56d0: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
56e0: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
56f0: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
5700: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
5710: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
5720: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
5730: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
5740: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
5750: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
5760: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
5770: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
5780: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
5790: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
57a0: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
57b0: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
57c0: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
57d0: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
57e0: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
57f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
5800: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
5810: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5820: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
5830: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
5840: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
5850: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
5860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5870: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5880: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
5890: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
58a0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
58b0: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
58c0: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
58d0: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
58e0: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
58f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5900: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
5910: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
5920: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
5930: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
5940: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5950: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
5960: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
5970: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5980: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5990: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
59a0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
59b0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
59c0: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
59d0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
59e0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
59f0: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
5a00: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ive, then the pE
5a10: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
5a20: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
5a30: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
5a40: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
5a50: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
5a60: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
5a70: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
5a80: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
5a90: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
5aa0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5ab0: 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65  .** to get numbe
5ac0: 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  r columns and th
5ad0: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65  e datatype for e
5ae0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
5af0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
5b00: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
5b10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5b20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5b30: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5b40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
5b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5b60: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
5b70: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
5b80: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
5b90: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
5ba0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
5bb0: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
5bc0: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
5bd0: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
5be0: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
5bf0: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
5c00: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
5c10: 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt,         /* I
5c20: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
5c30: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
5c40: 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  ss ORDER BY */. 
5c50: 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44   DistinctCtx *pD
5c60: 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e  istinct, /* If n
5c70: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5c80: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5c90: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65  DISTINCT */.  Se
5ca0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
5cb0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
5cc0: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
5cd0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5ce0: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
5cf0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5d00: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
5d10: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
5d20: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
5d30: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5d40: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
5d50: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
5d60: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  oop */.){.  Vdbe
5d70: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5d80: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5d90: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
5da0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5db0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
5dc0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
5dd0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
5de0: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
5df0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
5e00: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
5e10: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
5e20: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
5e30: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
5e40: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
5e50: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5e60: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
5e70: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
5e80: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
5e90: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
5ea0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
5eb0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
5ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
5ed0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
5ee0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
5ef0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
5f00: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
5f10: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
5f20: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
5f30: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5f40: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5f50: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5f60: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5f70: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5f80: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
5f90: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
5fa0: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
5fb0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
5fc0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
5fd0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
5fe0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5ff0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
6000: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
6010: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
6020: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
6030: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
6040: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
6050: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
6060: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
6070: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
6080: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
6090: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
60a0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
60b0: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
60c0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
60d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
60e0: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
60f0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
6100: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
6110: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
6120: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
6130: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
6140: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
6150: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6160: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6170: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6180: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
6190: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
61a0: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
61b0: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
61c0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
61d0: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
61e0: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
61f0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
6200: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
6210: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
6220: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
6230: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
6240: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
6250: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
6260: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
6270: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
6280: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
6290: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
62a0: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
62b0: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
62c0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
62d0: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
62e0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
62f0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
6300: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
6310: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
6320: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
6330: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
6340: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
6350: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
6360: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65  sultCol;.  regRe
6370: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6380: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
6390: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
63a0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
63b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
63c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
63d0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
63e0: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
63f0: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
6400: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
6410: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
6420: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6430: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6440: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6450: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6460: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6470: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6480: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6490: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
64a0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
64b0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
64c0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
64d0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
64e0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
64f0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
6500: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6510: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6520: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6530: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6540: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6560: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6570: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
6580: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6590: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
65a0: 72 65 67 52 65 73 75 6c 74 2c 20 30 2c 20 65 63  regResult, 0, ec
65b0: 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  elFlags);.  }.. 
65c0: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
65d0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
65e0: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
65f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6600: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
6610: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
6620: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
6630: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
6640: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
6650: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
6660: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
6670: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
6680: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
6690: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
66a0: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
66b0: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
66c0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
66d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
66e0: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
66f0: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
6700: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
6710: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6730: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
6740: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
6750: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
6760: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
6770: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
6780: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
6790: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
67a0: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
67b0: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
67c0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
67d0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
67e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
67f0: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
6800: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
6810: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
6820: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
6830: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
6840: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
6850: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
6860: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
6870: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
6880: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
6890: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
68a0: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
68b0: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
68c0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
68d0: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
68e0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
68f0: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
6900: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
6910: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
6920: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
6930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6940: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
6950: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
6960: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6970: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
6980: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
6990: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
69a0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
69b0: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
69c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
69d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
69e0: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
69f0: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
6a00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6a10: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
6a20: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
6a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
6a40: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
6a50: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
6a60: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
6a70: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
6a80: 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  e, pEList->a[i].
6a90: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6aa0: 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43    if( i<nResultC
6ab0: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
6ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ad0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
6ae0: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75  regResult+i, iJu
6af0: 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  mp, regPrev+i);.
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
6b10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6b20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6b30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6b40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6b50: 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Eq, regResult+
6b60: 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65  i, iContinue, re
6b70: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
6b80: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
6b90: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
6ba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
6bb0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6bc0: 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20  4(v, -1, (const 
6bd0: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
6be0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
6bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c00: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
6c10: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
6c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
6c30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
6c40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d  eCurrentAddr(v)=
6c50: 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65  =iJump || pParse
6c60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6c70: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ed );.        sq
6c80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c90: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
6ca0: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
6cb0: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20  nResultCol-1);. 
6cc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
6ce0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
6cf0: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
6d00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6d10: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
6d20: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
6d30: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
6d40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6d50: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6d60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
6d70: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
6d80: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
6d90: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
6da0: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
6db0: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
6dc0: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
6dd0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75  iContinue, nResu
6de0: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
6e00: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
6e10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6e20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
6e30: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  rt==0 ){.      c
6e40: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
6e50: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6e60: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
6e70: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6e80: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
6e90: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
6ea0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
6eb0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
6ec0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
6ed0: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
6ee0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
6ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6f00: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
6f10: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
6f20: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
6f30: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
6f40: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6f50: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
6f60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6f70: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6f80: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6f90: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
6fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6fb0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6fc0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6fe0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6ff0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
7000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7010: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
7020: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
7030: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
7040: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
7050: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
7060: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
7070: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
7080: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
7090: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
70a0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
70b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
70c0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
70d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
70e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
70f0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
7100: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7110: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
7120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7130: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7140: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7150: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
7160: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
7170: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
7180: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
7190: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
71a0: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
71b0: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
71c0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
71d0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
71e0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
71f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7200: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7210: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7220: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7230: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
7240: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7250: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7260: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
7270: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7280: 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t==SRT_Fifo );. 
7290: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
72a0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
72b0: 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  fo );.      sqli
72c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
72d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
72e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
72f0: 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69  ltCol, r1+nPrefi
7300: 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  xReg);.#ifndef S
7310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7320: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
7330: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a  SRT_DistFifo ){.
7340: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7350: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
7360: 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20   DistFifo, then 
7370: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
7380: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
7390: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
73a0: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
73b0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
73c0: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
73d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
73e0: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
73f0: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
7400: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
7410: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
7420: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
7430: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
7440: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
7450: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
7460: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
7470: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
7480: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
7490: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
74a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
74b0: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
74c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
74d0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
74e0: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
74f0: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
7500: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7510: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7530: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7540: 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  m+1, r1);.      
7550: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d    assert( pSort=
7560: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
7570: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
7580: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
7590: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
75a0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
75b0: 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72   r1+nPrefixReg,r
75c0: 65 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66  egResult,1,nPref
75d0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
75e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
75f0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
7600: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7610: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7620: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7630: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
7640: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
7650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7660: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
7670: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
7680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7690: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
76a0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
76b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
76c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
76d0: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
76e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
76f0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
7700: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
7710: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
7720: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
7730: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7740: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
7750: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
7760: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
7770: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
7780: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
7790: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
77a0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
77b0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
77c0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
77d0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
77e0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
77f0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
7800: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
7810: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
7820: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7830: 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29   nResultCol==1 )
7840: 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
7850: 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20  ffSdst =.       
7860: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7870: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
7880: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
7890: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
78a0: 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Sdst);.      if(
78b0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
78c0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
78d0: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
78e0: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
78f0: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
7900: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
7910: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
7920: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
7930: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
7940: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
7950: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
7960: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
7970: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
7980: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
7990: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
79a0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
79b0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
79c0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
79d0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
79e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 52   regResult, regR
79f0: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7a00: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7a10: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7a20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7a30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7a40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7a50: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
7a60: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7a70: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
7a80: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
7a90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7aa0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7ab0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7ac0: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7ad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7ae0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7af0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7b00: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7b10: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7b20: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
7b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7b40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7b50: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
7b60: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
7b70: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
7b80: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7b90: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7ba0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7bb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7bc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7bd0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7be0: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7bf0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7c00: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7c10: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7c40: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7c50: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7c60: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7c70: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7c80: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7c90: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7ca0: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7cb0: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7cc0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7cd0: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7ce0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7cf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7d00: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7d10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7d20: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7d30: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7d40: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7d50: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65 73  egResult, regRes
7d60: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
7d70: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7d80: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7d90: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
7da0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
7db0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
7dc0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
7dd0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
7de0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
7df0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e00: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
7e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7e20: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
7e30: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
7e40: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
7e50: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
7e60: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
7e70: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
7e80: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7e90: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
7ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7eb0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7ec0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
7ed0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7ee0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
7ef0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7f00: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7f10: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7f20: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7f30: 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ult, regResult, 
7f40: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
7f70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7f80: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7f90: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
7fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fb0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
7fc0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
7fd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ff0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8000: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
8010: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8030: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8040: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8050: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8060: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8080: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8090: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
80a0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
80b0: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
80c0: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
80d0: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
80e0: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
80f0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8100: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8110: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8120: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8130: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8140: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8150: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8160: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8170: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8180: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8190: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
81a0: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
81b0: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
81c0: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
81d0: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
81e0: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
81f0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8200: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8210: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8220: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8230: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8240: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8250: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8260: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8270: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8280: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8290: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
82a0: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
82b0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
82c0: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
82d0: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
82e0: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
82f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8300: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8310: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8320: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8330: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8340: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8350: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8360: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8370: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8380: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8390: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
83a0: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
83b0: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
83c0: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
83d0: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
83e0: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
83f0: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8400: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8410: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8420: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8430: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8440: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8450: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8460: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8470: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
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 20 20 20 72 65 67               reg
84a0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
84b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
84c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
84d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
84e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84f0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8500: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8510: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8520: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8530: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8550: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8560: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8570: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8580: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8590: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
85a0: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
85b0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
85c0: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
85d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
85e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
85f0: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8620: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8630: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8680: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
8690: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
86a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
86b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
86c0: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
86d0: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
86e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
86f0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
8700: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
8710: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65        if( addrTe
8720: 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  st ) sqlite3Vdbe
8730: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
8740: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Test);.      sql
8750: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
8760: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
8770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
8780: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
8790: 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  arse, r2, nKey+2
87a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
87b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
87c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
87d0: 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
87e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
87f0: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
8800: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
8810: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
8820: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
8830: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
8840: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
8850: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
8860: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
8870: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
8880: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
8890: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
88a0: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
88b0: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
88c0: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
88d0: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
88e0: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
88f0: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
8900: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
8910: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
8920: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
8930: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
8940: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8950: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
8960: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
8970: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
8980: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78   is reached.  Ex
8990: 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68  cept, if.  ** th
89a0: 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c  ere is a sorter,
89b0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
89c0: 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c  he sorter has al
89d0: 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20  ready limited.  
89e0: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f  ** the output fo
89f0: 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  r us..  */.  if(
8a00: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e   pSort==0 && p->
8a10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
8a20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8a30: 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
8a40: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
8a50: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
8a60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a  rage(v);.  }.}..
8a70: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
8a80: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8a90: 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61  sufficient for a
8aa0: 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79  n index of N key
8ab0: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20   columns and.** 
8ac0: 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e  X extra columns.
8ad0: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8ae0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
8af0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8b00: 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b  t N, int X){.  K
8b10: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
8b20: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
8b30: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
8b40: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65         sizeof(Ke
8b50: 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28  yInfo) + (N+X)*(
8b60: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
8b70: 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  +1));.  if( p ){
8b80: 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
8b90: 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43  er = (u8*)&p->aC
8ba0: 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d  oll[N+X];.    p-
8bb0: 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e  >nField = (u16)N
8bc0: 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64  ;.    p->nXField
8bd0: 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70   = (u16)X;.    p
8be0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
8bf0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
8c00: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
8c10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
8c20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8c30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
8c40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
8c50: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
8c60: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
8c70: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
8c80: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
8c90: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8ca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8cb0: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8cc0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
8cd0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
8ce0: 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a  e3DbFree(0, p);.
8cf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
8d00: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
8d10: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
8d20: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
8d30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
8d40: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
8d50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
8d60: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
8d70: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
8d80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8d90: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8da0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
8db0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
8dc0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
8dd0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
8de0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
8df0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
8e00: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
8e10: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
8e20: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
8e30: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
8e40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8e50: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
8e60: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8e70: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
8e80: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
8e90: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
8ea0: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
8eb0: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
8ec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
8ed0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
8ee0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
8ef0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
8f00: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
8f10: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
8f20: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
8f30: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
8f40: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
8f50: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
8f60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
8f70: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
8f80: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
8f90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
8fa0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
8fb0: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
8fc0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
8fd0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
8fe0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
8ff0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
9000: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
9010: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
9020: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
9030: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
9040: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
9050: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9060: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
9070: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
9080: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
9090: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
90a0: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
90b0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
90c0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
90d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
90e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
90f0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
9100: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
9110: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
9120: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
9130: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
9140: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
9150: 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
9160: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
9170: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
9180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9190: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
91a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
91b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
91c0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
91d0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
91e0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
91f0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
9200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
9210: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
9220: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
9230: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
9240: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
9250: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
9260: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
9270: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
9280: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
9290: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
92a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
92b0: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
92c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
92d0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
92e0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
92f0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
9300: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
9310: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
9320: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
9330: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
9340: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9350: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
9360: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
9370: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
9380: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
9390: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
93a0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
93b0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
93c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
93d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
93e0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
93f0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9400: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
9410: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
9420: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
9430: 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72  o->aColl[i-iStar
9440: 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  t] = pColl;.    
9450: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9460: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9470: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9480: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9490: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
94a0: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
94b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
94c0: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
94d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
94e0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
94f0: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9500: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9510: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9520: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9530: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9540: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9550: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9560: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9570: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9590: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
95a0: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
95b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
95c0: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
95d0: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
95e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
95f0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9610: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9620: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9630: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9640: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9650: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9660: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
9670: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
9680: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
9690: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
96a0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
96b0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
96c0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
96d0: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
96e0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
96f0: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
9700: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
9710: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
9720: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
9730: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
9740: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
9750: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
9760: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
9770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9780: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
9790: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
97a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
97b0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
97c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
97d0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
97e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
97f0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
9800: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
9810: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
9820: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
9830: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
9840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9850: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
9860: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
9870: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
9880: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
9890: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
98a0: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
98b0: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
98c0: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
98d0: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
98e0: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
98f0: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
9900: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
9910: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
9920: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
9930: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
9940: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
9950: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
9960: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
9970: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
9980: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
9990: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
99a0: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
99b0: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
99c0: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
99d0: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
99e0: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
99f0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9a00: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
9a10: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9a20: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9a30: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
9a40: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
9a50: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
9a60: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
9a70: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9a80: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
9a90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
9aa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9ab0: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
9ac0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9ad0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9ae0: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
9af0: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
9b00: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
9b10: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
9b20: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
9b30: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
9b40: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
9b50: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
9b60: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
9b70: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
9b80: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
9b90: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
9ba0: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
9bb0: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
9bc0: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
9bd0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
9be0: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
9bf0: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9c00: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
9c10: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9c20: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
9c30: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
9c40: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
9c50: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
9c60: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
9c70: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
9c80: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
9c90: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
9ca0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
9cb0: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
9cc0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
9cd0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
9ce0: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
9cf0: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
9d00: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
9d10: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
9d20: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
9d30: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
9d40: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
9d50: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
9d60: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
9d70: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
9d80: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
9d90: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
9da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
9dd0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 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 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9e00: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9e10: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
9e20: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e40: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
9e50: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
9e80: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
9e90: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
9ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9eb0: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
9ec0: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
9ed0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
9ee0: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
9ef0: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
9f00: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
9f10: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
9f20: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9f30: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
9f40: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9f50: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
9f60: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9f70: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
9f80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
9f90: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
9fa0: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
9fb0: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
9fc0: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
9fd0: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
9fe0: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
9ff0: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a010: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a020: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a030: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a040: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a050: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a060: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
a070: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
a080: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
a090: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
a0a0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
a0b0: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
a0c0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
a0d0: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
a0e0: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
a0f0: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
a100: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
a110: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
a120: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
a130: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
a140: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
a150: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
a160: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
a170: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
a180: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
a190: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
a1a0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
a1b0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
a1c0: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
a1d0: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
a1e0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
a1f0: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
a200: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a210: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a220: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
a230: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
a240: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
a250: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
a260: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
a270: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
a280: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
a290: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
a2a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
a2b0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
a2c0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
a2d0: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
a2e0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
a2f0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
a300: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a310: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
a320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a330: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
a340: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
a350: 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
a360: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a370: 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  );     /* Jump h
a380: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
a390: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
a3a0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
a3b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
a3c0: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
a3d0: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
a3e0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
a3f0: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
a400: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
a410: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
a420: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
a430: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
a440: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
a450: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
a460: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
a470: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
a480: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
a490: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  int nKey;.  int 
a4a0: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a4c0: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
a4d0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
a4e0: 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20  nt nSortData;   
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a500: 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65  * Trailing value
a510: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73  s to read from s
a520: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  orter */.  int i
a530: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
a560: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
a570: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
a580: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
a590: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
a5a0: 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74  OMMENTS.  struct
a5b0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a5c0: 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69  aOutEx = p->pELi
a5d0: 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20  st->a;.#endif.. 
a5e0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
a5f0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
a600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a610: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
a620: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
a630: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a640: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a650: 62 65 41 64 64 47 6f 74 6f 28 76 2c 20 61 64 64  beAddGoto(v, add
a660: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
a670: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
a680: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
a690: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
a6a0: 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e    iTab = pSort->
a6b0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
a6c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
a6d0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
a6e0: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
a6f0: 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20   regRowid = 0;. 
a700: 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73     regRow = pDes
a710: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53  t->iSdst;.    nS
a720: 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d  ortData = nColum
a730: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
a740: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
a750: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a760: 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77  rse);.    regRow
a770: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a780: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a790: 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b    nSortData = 1;
a7a0: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
a7b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
a7c0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
a7d0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
a7e0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
a7f0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
a800: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
a810: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a820: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
a830: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a840: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
a850: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
a860: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
a870: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
a880: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
a890: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a8b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
a8c0: 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62  Pseudo, iSortTab
a8d0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b  , regSortOut, nK
a8e0: 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b  ey+1+nSortData);
a8f0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63  .    if( addrOnc
a900: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  e ) sqlite3VdbeJ
a910: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
a920: 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  nce);.    addr =
a930: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
a940: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
a950: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
a960: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
a970: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a980: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
a990: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
a9a0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
a9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9c0: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
a9d0: 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f  ata, iTab, regSo
a9e0: 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29  rtOut, iSortTab)
a9f0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a  ;.    bSeq = 0;.
aa00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
aa10: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
aa20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aa30: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
aa40: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
aa50: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
aa60: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
aa70: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
aa80: 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54  nue);.    iSortT
aa90: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62  ab = iTab;.    b
aaa0: 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  Seq = 1;.  }.  f
aab0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44  or(i=0; i<nSortD
aac0: 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ata; i++){.    s
aad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
aae0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
aaf0: 53 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53  SortTab, nKey+bS
ab00: 65 71 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b  eq+i, regRow+i);
ab10: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ab20: 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45  ((v, "%s", aOutE
ab30: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75  x[i].zName ? aOu
ab40: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
ab50: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
ab60: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
ab70: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
ab80: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
ab90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
aba0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
abb0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
abc0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
abd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abe0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
abf0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
ac00: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
ac10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ac20: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
ac30: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
ac40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
ac50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ac60: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
ac70: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
ac80: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
ac90: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
aca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
acb0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
acc0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
acd0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
ad00: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
ad10: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
ad20: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
ad30: 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20  , regRow, 1);.  
ad40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ad50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
ad60: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
ad70: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62  gRowid);.      b
ad80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ad90: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
ada0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
adb0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
adc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
add0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
ade0: 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b  gRow, iParm, 1);
adf0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
ae00: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
ae10: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
ae20: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
ae30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ae40: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
ae50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
ae60: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
ae70: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
ae80: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
ae90: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
aea0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
aeb0: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
aec0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
aed0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aee0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
aef0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
af00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
af20: 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e  sultRow, pDest->
af30: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
af40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
af50: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
af60: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
af70: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
af80: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
af90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
afa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
afb0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
afc0: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
afd0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
afe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
aff0: 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20  ( regRowid ){.  
b000: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b010: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b020: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  regRow);.    sql
b030: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
b040: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
b050: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
b060: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
b070: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
b080: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b090: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
b0a0: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
b0b0: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b0c0: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b0d0: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
b0e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b0f0: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
b100: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
b110: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
b120: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b130: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b140: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
b150: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
b160: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
b170: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
b180: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
b190: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
b1a0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
b1b0: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
b1c0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
b1d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
b1e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
b1f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
b200: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
b210: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
b220: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
b230: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
b240: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
b250: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
b260: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
b270: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
b280: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
b290: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b2a0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
b2b0: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
b2c0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
b2d0: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
b2e0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
b2f0: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
b300: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
b310: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
b320: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
b330: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
b340: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
b350: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b360: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
b370: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b380: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
b390: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
b3a0: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
b3b0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
b3c0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
b3d0: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
b3e0: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
b3f0: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
b400: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
b410: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
b420: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
b430: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
b440: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
b450: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
b460: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
b470: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
b480: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b490: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b4a0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b4b0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
b4c0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
b4d0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
b4e0: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
b4f0: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
b500: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
b510: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
b520: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
b530: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
b540: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
b550: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
b560: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
b570: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
b580: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
b590: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
b5a0: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
b5b0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b5c0: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
b5d0: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
b5e0: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
b5f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b600: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
b610: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
b620: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
b630: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
b640: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
b650: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
b660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b670: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
b680: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b690: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b6a0: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b6b0: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
b6c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b6d0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
b6e0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
b6f0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
b700: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
b710: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b720: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
b730: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
b740: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
b750: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
b760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b770: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
b780: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
b790: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
b7a0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
b7b0: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
b7c0: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
b7d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b7e0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
b7f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
b800: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
b810: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
b820: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
b830: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
b840: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 4e 45 56  endif..  if( NEV
b850: 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20  ER(pExpr==0) || 
b860: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
b870: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
b880: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b890: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b8a0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
b8b0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
b8c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
b8d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b8e0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
b8f0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
b900: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
b910: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
b920: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
b930: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
b940: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
b950: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
b960: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
b970: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
b980: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
b990: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
b9a0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
b9b0: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
b9c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
b9d0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
b9e0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
b9f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
ba00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
ba10: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
ba20: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
ba30: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
ba40: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
ba50: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
ba60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ba70: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
ba80: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
ba90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
baa0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
bab0: 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  N );.      while
bac0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
bad0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
bae0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
baf0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
bb00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
bb10: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
bb20: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
bb30: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
bb40: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
bb50: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
bb60: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
bb70: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
bb80: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
bb90: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
bba0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
bbb0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
bbc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bbd0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
bbe0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
bbf0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
bc00: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
bc10: 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74       /* At one t
bc20: 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61  ime, code such a
bc30: 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22  s "SELECT new.x"
bc40: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
bc50: 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  r would.        
bc60: 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f  ** cause this co
bc70: 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20  ndition to run. 
bc80: 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20   Since then, we 
bc90: 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65  have restructure
bca0: 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  d how.        **
bcb0: 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73   trigger code is
bcc0: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73   generated and s
bcd0: 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  o this condition
bce0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20   is no longer . 
bcf0: 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
bd00: 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20  le. However, it 
bd10: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75  can still be tru
bd20: 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  e for statements
bd30: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a   like.        **
bd40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
bd50: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bd60: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
bd70: 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45  ABLE t1(col INTE
bd80: 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a  GER);.        **
bd90: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bda0: 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46  T t1.col) FROM F
bdb0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
bdc0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
bdd0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
bde0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
bdf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e   expression "t1.
be00: 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20  col" in the .   
be10: 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65       ** sub-sele
be20: 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ct. In this case
be30: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
be40: 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65   type to NULL, e
be50: 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ven.        ** t
be60: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
be70: 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47  really be "INTEG
be80: 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ER"..        **.
be90: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
bea0: 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
beb0: 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , as the column 
bec0: 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22  type of "t1.col"
bed0: 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20   is never.      
bee0: 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20    ** used. When 
bef0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
bf00: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
bf10: 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20  pression .      
bf20: 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31    ** "(SELECT t1
bf30: 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72  .col)", the corr
bf40: 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75  ect type is retu
bf50: 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b  rned (see the TK
bf60: 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20  _SELECT.        
bf70: 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e  ** branch below.
bf80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65    */.        bre
bf90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
bfa0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
bfb0: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d  && pExpr->pTab==
bfc0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
bfd0: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
bfe0: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
bff0: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
c000: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
c010: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
c020: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
c030: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
c040: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
c050: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c060: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
c070: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
c080: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
c090: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
c0a0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
c0b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c0c0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41  if( iCol>=0 && A
c0d0: 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70  LWAYS(iCol<pS->p
c0e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c100: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
c110: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
c120: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
c130: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
c140: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
c150: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
c160: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
c170: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
c180: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
c190: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
c1a0: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
c1b0: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
c1c0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
c1d0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
c1e0: 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20 69  * The ALWAYS() i
c1f0: 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d  s because iCol>=
c200: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
c210: 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  r will have been
c220: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
c230: 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79 20  ught already by 
c240: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
c250: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c260: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
c270: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
c280: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c290: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
c2a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
c2b0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c2c0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c2d0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c2e0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
c2f0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
c300: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
c310: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c320: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
c330: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
c340: 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  b,&zOrigCol, &es
c350: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c360: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
c370: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
c380: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
c390: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
c3a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c3b0: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
c3c0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
c3d0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
c3e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c3f0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
c400: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
c410: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64  b->nCol) );.#ifd
c420: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c430: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c450: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c460: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c470: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
c480: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
c490: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c4b0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
c4c0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
c4d0: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
c4e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c4f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c500: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
c510: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
c520: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Est;.        }. 
c530: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
c540: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
c550: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
c560: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
c570: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c580: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c590: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
c5a0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c5b0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
c5c0: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
c5d0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
c5e0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
c5f0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
c600: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c610: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c620: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
c630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c640: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
c650: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
c660: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ype;.          e
c670: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c680: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c690: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
c6a0: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
c6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
c6c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c6d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
c6e0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
c6f0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
c700: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
c710: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
c720: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
c730: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
c740: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
c750: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
c760: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
c770: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
c780: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
c790: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
c7a0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
c7b0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
c7c0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
c7d0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
c7e0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
c7f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
c800: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
c810: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
c820: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
c830: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
c840: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c850: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c860: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
c870: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
c880: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
c890: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
c8a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c8b0: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
c8c0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
c8d0: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
c8e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c8f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
c900: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c910: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c920: 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f  DATA  .  if( pzO
c930: 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73  rigDb ){.    ass
c940: 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26  ert( pzOrigTab &
c950: 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20  & pzOrigCol );. 
c960: 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a     *pzOrigDb = z
c970: 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  OrigDb;.    *pzO
c980: 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61  rigTab = zOrigTa
c990: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f  b;.    *pzOrigCo
c9a0: 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20  l = zOrigCol;.  
c9b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
c9c0: 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74  EstWidth ) *pEst
c9d0: 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68  Width = estWidth
c9e0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  ;.  return zType
c9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
ca00: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
ca10: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
ca20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
ca30: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
ca40: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
ca50: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
ca60: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
ca70: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
ca80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ca90: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
caa0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
cab0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
cac0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
cad0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
cae0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
caf0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
cb00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
cb10: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
cb20: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
cb30: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
cb40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
cb50: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
cb60: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
cb70: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
cb80: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
cb90: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
cba0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
cbb0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
cbc0: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
cbd0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
cbe0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
cbf0: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
cc00: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
cc10: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
cc20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
cc30: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
cc40: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
cc50: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
cc60: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
cc70: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
cc80: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
cc90: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
cca0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
ccb0: 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  ol, 0);..    /* 
ccc0: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
ccd0: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
cce0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
ccf0: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
cd00: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
cd10: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
cd20: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
cd30: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
cd40: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
cd50: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
cd60: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
cd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cd80: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cd90: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
cda0: 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54  , zOrigDb, SQLIT
cdb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cdd0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cde0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
cdf0: 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52  igTab, SQLITE_TR
ce00: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
ce10: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ce20: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ce30: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
ce40: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
ce50: 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IENT);.#else.   
ce60: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
ce70: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
ce80: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
ce90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cea0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ceb0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
cec0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
ced0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
cee0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
cef0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cf00: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
cf10: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
cf20: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
cf30: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
cf40: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
cf50: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
cf60: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
cf70: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
cf80: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
cf90: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
cfa0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
cfb0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
cfc0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
cfd0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
cfe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
cff0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d000: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d010: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d020: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d030: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d040: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d050: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d060: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d070: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
d080: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
d090: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d0a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d0b0: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
d0c0: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
d0d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d0e0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
d0f0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
d100: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
d110: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
d120: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d130: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d140: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
d150: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
d160: 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76  esSet || NEVER(v
d170: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
d180: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
d190: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
d1a0: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
d1b0: 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d  fullNames = (db-
d1c0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d1d0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
d1e0: 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d  ;.  shortNames =
d1f0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
d200: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
d210: 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  es)!=0;.  sqlite
d220: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
d230: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
d240: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
d250: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
d260: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d270: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
d280: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
d290: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
d2a0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
d2b0: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
d2c0: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
d2d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
d2e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
d2f0: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
d300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d310: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d320: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
d330: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d340: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
d350: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
d360: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
d370: 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69  OLUMN) && pTabLi
d380: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
d390: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
d3a0: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
d3b0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
d3c0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
d3d0: 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
d3e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  pTabList->nSrc);
d3f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
d400: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  f( pTabList->a[j
d410: 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54  ].iCursor==p->iT
d420: 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  able ) break;.  
d430: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
d440: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
d450: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
d460: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
d470: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
d480: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
d490: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
d4a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
d4b0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
d4c0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
d4d0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
d4e0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
d4f0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
d500: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
d510: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
d520: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
d530: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
d540: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
d550: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
d560: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
d570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d580: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d590: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
d5a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d5b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
d5c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
d5d0: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
d5e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
d5f0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
d600: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
d610: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
d620: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
d630: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
d640: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
d650: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d670: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d680: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
d690: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
d6a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d6b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d6c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d6d0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d6e0: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
d6f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
d700: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d710: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d720: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
d730: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
d740: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
d750: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
d760: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
d770: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d780: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
d790: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d7a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d7b0: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
d7c0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
d7d0: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
d7e0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
d7f0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
d800: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
d810: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
d820: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
d830: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
d840: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d850: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
d860: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d870: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d880: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
d890: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
d8a0: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
d8b0: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
d8c0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
d8d0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
d8e0: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
d8f0: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
d900: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
d910: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
d920: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
d930: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
d940: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
d950: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
d960: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
d970: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
d980: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d990: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
d9a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
d9b0: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
d9c0: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
d9d0: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
d9e0: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
d9f0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
da00: 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
da10: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
da20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
da30: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
da40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
da50: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
da60: 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
da70: 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
da80: 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
da90: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
daa0: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
dab0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
dac0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
dad0: 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
dae0: 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
daf0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
db00: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
db10: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
db20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
db30: 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
db40: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
db50: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
db80: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
db90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dba0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
dbb0: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
dbc0: 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
dbd0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
dbe0: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
dbf0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
dc00: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
dc10: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
dc40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
dc50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
dc60: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
dc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
dc80: 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  ession for a sin
dc90: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
dca0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  n */.  char *zNa
dcb0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
dcc0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
dcd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
dce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dcf0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
dd00: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
dd10: 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29  ..  if( pEList )
dd20: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c  {.    nCol = pEL
dd30: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
dd40: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
dd50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
dd60: 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e  izeof(aCol[0])*n
dd70: 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Col);.    testca
dd80: 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  se( aCol==0 );. 
dd90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
dda0: 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d   = 0;.    aCol =
ddb0: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c   0;.  }.  *pnCol
ddc0: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f   = nCol;.  *paCo
ddd0: 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72  l = aCol;..  for
dde0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
ddf0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
de00: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
de10: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
de20: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
de30: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
de40: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
de50: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
de60: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
de70: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
de80: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
de90: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
dea0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
deb0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
dec0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
ded0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
dee0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
def0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
df00: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
df10: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
df20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
df30: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
df40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
df50: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
df60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
df70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
df80: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
df90: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
dfa0: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
dfb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
dfc0: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
dfd0: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
dfe0: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
dff0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
e000: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e010: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
e020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e030: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e040: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
e050: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
e060: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
e070: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
e080: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
e090: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
e0a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e0b0: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
e0c0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
e0d0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
e0e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
e0f0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
e100: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
e110: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
e120: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e130: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
e140: 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70       iCol>=0 ? p
e150: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
e160: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29  zName : "rowid")
e170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e180: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e190: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
e1a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
e1b0: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
e1c0: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
e1d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
e1e0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e1f0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f  tf(db, "%s", pCo
e200: 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  lExpr->u.zToken)
e210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e220: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
e230: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
e240: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
e250: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
e260: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
e270: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
e280: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
e290: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
e2a0: 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pan);.      }.  
e2b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
e2c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
e2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
e2e0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
e2f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e300: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
e310: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
e320: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
e330: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
e340: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
e350: 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74  ** append an int
e360: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
e370: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
e380: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
e390: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
e3a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
e3b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
e3c0: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
e3d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
e3e0: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
e3f0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
e400: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e410: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
e420: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
e430: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61         for(k=nNa
e440: 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c  me-1; k>1 && sql
e450: 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d  ite3Isdigit(zNam
e460: 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20  e[k]); k--){}.  
e470: 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20 26        if( k>=0 &
e480: 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20  & zName[k]==':' 
e490: 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20  ) nName = k;.   
e4a0: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
e4b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
e4c0: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
e4d0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
e4e0: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
e4f0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
e500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e510: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
e520: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
e530: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
e540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
e550: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
e560: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e570: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
e580: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
e590: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e5a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
e5b0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
e5c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e5d0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
e5e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
e5f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e600: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
e610: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
e620: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
e630: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
e650: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e660: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
e670: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
e680: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
e690: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
e6a0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e6b0: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
e6c0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
e6d0: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
e6e0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
e6f0: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
e700: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
e710: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
e720: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
e730: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
e740: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
e750: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
e760: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
e770: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
e780: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e790: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
e7a0: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
e7b0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
e7c0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
e7d0: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
e7e0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
e7f0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
e800: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
e810: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e820: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e830: 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
e840: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
e850: 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
e860: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
e870: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
e880: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
e890: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
e8a0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
e8b0: 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
e8c0: 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  lations */.){.  
e8d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e8e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65  arse->db;.  Name
e8f0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43  Context sNC;.  C
e900: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43  olumn *pCol;.  C
e910: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
e920: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
e930: 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  p;.  struct Expr
e940: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
e950: 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a  u64 szAll = 0;..
e960: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
e970: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
e980: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
e990: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
e9a0: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
e9b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
e9c0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
e9d0: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
e9e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e9f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ea00: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
ea10: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
ea20: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
ea30: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
ea40: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
ea50: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
ea60: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
ea70: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
ea80: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
ea90: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
eaa0: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
eab0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  xpr;.    if( pCo
eac0: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20  l->zType==0 ){. 
ead0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65       pCol->zType
eae0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
eaf0: 75 70 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  up(db, .        
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
eb20: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
eb30: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 7d 0a  >szEst));.    }.
eb40: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
eb50: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
eb60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
eb70: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
eb80: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ty(p);.    if( p
eb90: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
eba0: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
ebb0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
ebc0: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
ebd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ebe0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
ebf0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
ec00: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
ec10: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ec20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
ec30: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
ec40: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
ec50: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
ec60: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ec70: 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d  gEst(szAll*4);.}
ec80: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ec90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
eca0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
ecb0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
ecc0: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
ecd0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ece0: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
ecf0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
ed00: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
ed10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ed20: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
ed30: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
ed40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ed50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
ed60: 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
ed70: 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
ed80: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
ed90: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
eda0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
edb0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
edc0: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
edd0: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
ede0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
edf0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
ee00: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ee10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
ee20: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
ee30: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
ee40: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
ee50: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
ee60: 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
ee70: 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
ee80: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
ee90: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
eea0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
eeb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
eec0: 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
eed0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
eee0: 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
eef0: 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
ef00: 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
ef10: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
ef20: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
ef30: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
ef40: 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  d==0 );.  pTab->
ef50: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
ef60: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
ef70: 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
ef80: 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
ef90: 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
efa0: 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
efb0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
efc0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
efd0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
efe0: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
eff0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
f000: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
f010: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
f020: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
f030: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
f040: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
f050: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f060: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
f070: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
f080: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
f090: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
f0a0: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
f0b0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
f0c0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
f0d0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
f0e0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
f0f0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
f100: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f110: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
f120: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
f130: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
f140: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
f150: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
f160: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
f170: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f180: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
f190: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
f1a0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
f1b0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29  beCreate(pParse)
f1c0: 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71  ;.    if( v ) sq
f1d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
f1e0: 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20  v, OP_Init);.   
f1f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f   if( pParse->pTo
f200: 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26  plevel==0.     &
f210: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
f220: 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62  abled(pParse->db
f230: 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75  ,SQLITE_FactorOu
f240: 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20  tConst).    ){. 
f250: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
f260: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a  onstFactor = 1;.
f270: 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74      }..  }.  ret
f280: 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn v;.}.../*.**
f290: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
f2a0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f2b0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
f2c0: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
f2d0: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
f2e0: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
f2f0: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
f300: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
f310: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
f320: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
f330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
f340: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
f350: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
f360: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
f370: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
f380: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
f390: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
f3a0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
f3b0: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
f3c0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
f3d0: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
f3e0: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
f3f0: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
f400: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
f410: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
f420: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
f430: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
f440: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f450: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
f460: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f470: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
f480: 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
f490: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
f4a0: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
f4b0: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
f4c0: 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
f4d0: 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
f4e0: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
f4f0: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
f500: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
f510: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
f520: 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a   values (zero).*
f530: 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
f540: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
f550: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73  .**.** The iOffs
f560: 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20  et register (if 
f570: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
f580: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
f590: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
f5a0: 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c   OFFSET.  The iL
f5b0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73  imit register is
f5c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f5d0: 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72  LIMIT.  Register
f5e0: 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73  .** iOffset+1 is
f5f0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
f600: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a  LIMIT+OFFSET..**
f610: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
f620: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
f630: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
f640: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
f650: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
f660: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
f670: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
f680: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
f690: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
f6a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
f6b0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
f6c0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
f6d0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
f6e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
f6f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
f700: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
f710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f720: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
f730: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
f740: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
f750: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
f760: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
f770: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
f780: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
f790: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
f7a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
f7b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
f7c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
f7d0: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
f7e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
f7f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
f800: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
f810: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
f820: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
f830: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
f840: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
f850: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
f860: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
f870: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
f880: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
f890: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
f8a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
f8b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
f8c0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
f8d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f8e0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
f8f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
f910: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
f920: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
f930: 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  er(p->pLimit, &n
f940: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
f950: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f960: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
f970: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
f980: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f990: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
f9a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
f9b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f9c0: 65 33 56 64 62 65 41 64 64 47 6f 74 6f 28 76 2c  e3VdbeAddGoto(v,
f9d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f9e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
f9f0: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
fa00: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
fa10: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
fa20: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
fa30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
fa40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fa50: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
fa60: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
fa70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa80: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
fa90: 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
faa0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fab0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fac0: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
fad0: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
fae0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
faf0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69   OP_IfNot, iLimi
fb00: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
fb10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fb20: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
fb30: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
fb40: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
fb50: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
fb60: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
fb70: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
fb80: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
fb90: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
fba0: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
fbb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fbc0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
fbd0: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
fbe0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
fbf0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
fc00: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
fc10: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
fc20: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
fc30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
fc40: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
fc50: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
fc60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc70: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
fc80: 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
fc90: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
fca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fcb0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
fcc0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fce0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fcf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fd00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fd10: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
fd20: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
fd30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
fd40: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
fd50: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
fd60: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
fd70: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fd80: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
fd90: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fda0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fdb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fdc0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
fdd0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
fde0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fdf0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
fe00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
fe10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
fe20: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
fe30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
fe40: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
fe50: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fe60: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
fe70: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
fe80: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
fe90: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
fea0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
feb0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
fec0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
fed0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
fee0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fef0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
ff00: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
ff10: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
ff20: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
ff30: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
ff40: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
ff50: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
ff60: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
ff70: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
ff80: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
ff90: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
ffa0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
ffb0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
ffc0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
ffd0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
ffe0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
fff0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
10000 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
10010 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
10020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
10030 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
10040 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
10050 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62    /* iCol must b
10060 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70  e less than p->p
10070 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f  EList->nExpr.  O
10080 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
10090 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76  r would.  ** hav
100a0 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75  e been thrown du
100b0 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75  ring name resolu
100c0 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c  tion and we woul
100d0 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65  d not have gotte
100e0 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20  n.  ** this far 
100f0 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  */.  if( pRet==0
10100 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c   && ALWAYS(iCol<
10110 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10120 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  ) ){.    pRet = 
10130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
10140 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
10150 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
10160 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
10170 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
10180 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
10190 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
101a0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
101b0 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f  meter is a compo
101c0 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69  und SELECT.** wi
101d0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
101e0 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63  lause. This func
101f0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
10200 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79  nd returns a Key
10210 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
10220 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69  e suitable for i
10230 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
10240 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20  ORDER BY..**.** 
10250 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
10260 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
10270 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
10280 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65  from malloc. The
10290 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
102a0 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
102b0 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67  ble for ensuring
102c0 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
102d0 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
102e0 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
102f0 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
10300 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
10310 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  ByKeyInfo(Parse 
10320 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
10330 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b  *p, int nExtra){
10340 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
10350 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
10360 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  rBy;.  int nOrde
10370 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
10380 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69  y->nExpr;.  sqli
10390 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
103a0 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
103b0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b  *pRet = sqlite3K
103c0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
103d0 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c  nOrderBy+nExtra,
103e0 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20   1);.  if( pRet 
103f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
10400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
10410 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
10420 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
10430 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
10440 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d   &pOrderBy->a[i]
10450 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  ;.      Expr *pT
10460 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  erm = pItem->pEx
10470 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  pr;.      CollSe
10480 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20  q *pColl;..     
10490 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
104a0 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
104b0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
104c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
104d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65  lSeq(pParse, pTe
104e0 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
104f0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
10500 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
10510 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
10520 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
10530 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  rByCol-1);.     
10540 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
10550 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
10560 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
10570 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
10580 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20  pExpr =.        
10590 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
105a0 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
105b0 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f  arse, pTerm, pCo
105c0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
105d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
105e0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
105f0 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74  IsWriteable(pRet
10600 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  ) );.      pRet-
10610 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
10620 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  l;.      pRet->a
10630 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
10640 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
10650 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
10660 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
10670 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
10680 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
10690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
106a0 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20   generates VDBE 
106b0 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20  code to compute 
106c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
106d0 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a   WITH RECURSIVE.
106e0 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  ** query of the 
106f0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72  form:.**.**   <r
10700 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20  ecursive-table> 
10710 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79  AS (<setup-query
10720 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72  > UNION [ALL] <r
10730 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29  ecursive-query>)
10740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10750 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
10760 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
10770 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
10780 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20       p->pPrior  
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54      p.**.**.** T
107d0 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20  here is exactly 
107e0 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
107f0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
10800 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
10810 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65   clause.** of re
10820 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d  cursive-query, m
10830 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53  arked with the S
10840 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69  rcList->a[].fg.i
10850 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e  sRecursive flag.
10860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70  .**.** The setup
10870 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65  -query runs once
10880 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
10890 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72  initial set of r
108a0 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69  ows that go.** i
108b0 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c  nto a Queue tabl
108c0 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74  e.  Rows are ext
108d0 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
108e0 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20  Queue table one 
108f0 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68  by.** one.  Each
10900 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66   row extracted f
10910 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74  rom Queue is out
10920 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  put to pDest.  T
10930 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a  hen the single.*
10940 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20  * extracted row 
10950 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72  (now in the iCur
10960 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f  rent table) beco
10970 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  mes the content 
10980 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73  of the.** recurs
10990 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20  ive-table for a 
109a0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20  recursive-query 
109b0 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74  run.  The output
109c0 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
109d0 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64  e-query.** is ad
109e0 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ded back into th
109f0 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10a00 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77  Then another row
10a10 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
10a20 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20  om Queue.** and 
10a30 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f  the iteration co
10a40 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68  ntinues until th
10a50 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
10a60 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
10a70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
10a80 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ery operator is 
10a90 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75  UNION then no du
10aa0 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
10ab0 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65   ever.** inserte
10ac0 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  d into the Queue
10ad0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69   table.  The iDi
10ae0 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65  stinct table kee
10af0 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c  ps a copy of all
10b00 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61   rows.** that ha
10b10 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73  ve ever been ins
10b20 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65  erted into Queue
10b30 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c   and causes dupl
10b40 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20  icates to be.** 
10b50 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74  discarded.  If t
10b60 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  he operator is U
10b70 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64  NION ALL, then d
10b80 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c  uplicates are al
10b90 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  lowed..** .** If
10ba0 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61   the query has a
10bb0 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e  n ORDER BY, then
10bc0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
10bd0 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20  Queue table are 
10be0 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  kept in.** ORDER
10bf0 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68   BY order and th
10c00 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73  e first entry is
10c10 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65   extracted for e
10c20 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68  ach cycle.  With
10c30 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20  out.** an ORDER 
10c40 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61  BY, the Queue ta
10c50 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49  ble is just a FI
10c60 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c  FO..**.** If a L
10c70 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70  IMIT clause is p
10c80 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68  rovided, then th
10c90 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70  e iteration stop
10ca0 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f  s after LIMIT ro
10cb0 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  ws.** have been 
10cc0 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
10cd0 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72    A LIMIT of zer
10ce0 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  o means to outpu
10cf0 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a  t no rows and a.
10d00 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49  ** negative LIMI
10d10 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  T means to outpu
10d20 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20  t all rows.  If 
10d30 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e  there is also an
10d40 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a   OFFSET clause.*
10d50 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76  * with a positiv
10d60 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  e value, then th
10d70 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f  e first OFFSET o
10d80 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61  utputs are disca
10d90 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74  rded rather.** t
10da0 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74  han being sent t
10db0 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49  o pDest.  The LI
10dc0 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e  MIT count does n
10dd0 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61  ot begin until a
10de0 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72  fter OFFSET.** r
10df0 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b  ows have been sk
10e00 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
10e10 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69   void generateWi
10e20 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
10e30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10e40 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
10e50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10e60 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
10e70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
10e80 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
10e90 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
10ea0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
10eb0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
10ec0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
10ed0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
10ee0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
10ef0 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  p->pSrc;      /*
10f00 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
10f10 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
10f20 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  e query */.  int
10f30 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
10f40 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75  t->nExpr;  /* Nu
10f50 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10f60 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
10f70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65   table */.  Vdbe
10f80 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10f90 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
10fa0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10fb0 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
10fc0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  uction */.  Sele
10fd0 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e  ct *pSetup = p->
10fe0 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65  pPrior;   /* The
10ff0 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a   setup query */.
11000 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
11030 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
11040 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b  Cont, addrBreak;
11050 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55        /* CONTINU
11060 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72  E and BREAK addr
11070 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  esses */.  int i
11080 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
11090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
110a0 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
110b0 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e  .  int regCurren
110c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
110d0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
110e0 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62  ding Current tab
110f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65  le */.  int iQue
11100 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
11110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65        /* The Que
11120 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
11130 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  t iDistinct = 0;
11140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11150 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20  o ensure unique 
11160 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e  results if UNION
11170 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
11180 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20  = SRT_Fifo;     
11190 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72      /* How to wr
111a0 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a  ite to Queue */.
111b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
111c0 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  tQueue;         
111d0 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61  /* SelectDest ta
111e0 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65  rgetting the Que
111f0 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
11200 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11220 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
11230 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11250 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11260 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
11270 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
11280 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
11290 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
112a0 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
112b0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  set;       /* Sa
112c0 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  ved LIMIT and OF
112d0 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65  FSET */.  int re
112e0 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65  gLimit, regOffse
112f0 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t;      /* Regis
11300 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d  ters used by LIM
11310 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
11320 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75  ..  /* Obtain au
11330 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64  thorization to d
11340 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  o a recursive qu
11350 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ery */.  if( sql
11360 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
11370 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43  arse, SQLITE_REC
11380 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29  URSIVE, 0, 0, 0)
11390 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
113a0 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d   Process the LIM
113b0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
113c0 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65  auses, if they e
113d0 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72  xist */.  addrBr
113e0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
113f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11400 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11410 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11420 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11430 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
11440 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
11450 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
11460 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
11470 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
11480 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
11490 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
114a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
114b0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
114c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
114d0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
114e0 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
114f0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
11500 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
11510 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
11520 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
11530 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
11540 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
11550 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  a[i].fg.isRecurs
11560 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
11570 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
11580 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
11590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
115a0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
115b0 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
115c0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
115d0 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
115e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
115f0 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
11600 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
11610 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
11620 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
11630 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
11640 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
11650 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
11660 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
11670 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
11680 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
11690 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
116a0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
116b0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
116c0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
116d0 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
116e0 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
116f0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
11700 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
11710 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
11720 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
11730 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
11740 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11750 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
11760 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
11770 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
11780 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
11790 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
117a0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
117b0 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
117c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
117d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117e0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
117f0 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
11800 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
11810 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
11820 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
11830 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
11840 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
11850 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
11860 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
11870 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11880 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11890 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
118a0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
118d0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
118e0 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
118f0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
11900 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
11910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11920 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11930 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
11940 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
11950 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11960 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
11970 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
11980 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
11990 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
119a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
119b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
119c0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
119d0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
119e0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
119f0 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
11a00 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
11a10 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
11a20 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
11a30 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
11a40 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11a50 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11a60 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
11a70 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
11a80 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
11a90 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
11aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11ab0 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
11ac0 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
11ad0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
11ae0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
11af0 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
11b00 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
11b10 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
11b20 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
11b30 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
11b40 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
11b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b60 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
11b70 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
11b80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11b90 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
11ba0 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
11bb0 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
11bc0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
11bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11be0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
11bf0 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
11c00 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
11c10 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
11c20 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
11c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11c40 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
11c50 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11c60 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
11c70 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
11c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11c90 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
11ca0 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
11cb0 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
11cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11cd0 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
11ce0 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
11cf0 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
11d00 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
11d10 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
11d20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11d30 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
11d40 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
11d50 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
11d60 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
11d70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
11d80 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
11d90 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
11da0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
11db0 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
11dc0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
11dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11de0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
11df0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
11e00 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
11e10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11e20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11e30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11e40 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
11e50 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
11e60 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
11e70 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
11e80 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
11e90 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
11ea0 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
11eb0 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
11ec0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
11ed0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
11ee0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
11ef0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
11f00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11f10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
11f20 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
11f30 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
11f40 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
11f50 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
11f60 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  or = 0;.    sqli
11f70 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
11f80 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  , p, &destQueue)
11f90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
11fa0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
11fb0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
11fc0 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  etup;.  }..  /* 
11fd0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
11fe0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
11ff0 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
12000 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
12010 64 64 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  ddGoto(v, addrTo
12020 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
12030 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12040 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
12050 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
12060 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
12070 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
12080 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
12090 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
120a0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
120b0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
120c0 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
120d0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
120e0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
120f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12100 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
12110 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
12120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12130 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12140 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12150 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12160 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12170 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
12180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
12190 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
121a0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
121b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
121c0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
121d0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
121e0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
121f0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
12200 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
12210 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
12220 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
12230 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
12240 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
12250 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
12260 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
12270 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
12280 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
12290 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
122a0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
122b0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
122c0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
122d0 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
122e0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
122f0 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
12300 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
12310 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
12320 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
12330 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
12340 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
12350 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
12360 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
12370 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
12380 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
12390 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
123a0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
123b0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
123c0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
123d0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
123e0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
123f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12400 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12410 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12420 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12430 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12440 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12450 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12460 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
12470 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
12480 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
12490 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
124a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
124b0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
124c0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
124d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
124e0 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
124f0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
12500 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
12510 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
12520 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
12530 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
12540 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
12550 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
12560 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
12570 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
12580 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
12590 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
125a0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
125b0 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
125c0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
125d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
125e0 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
125f0 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
12600 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
12610 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
12620 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
12630 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12640 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
12650 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
12660 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12670 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
12680 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
12690 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
126a0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
126b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
126c0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
126d0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
126e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
126f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12700 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
12710 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
12720 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
12730 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
12740 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
12750 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
12760 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
12770 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
12780 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
12790 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
127a0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
127b0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
127c0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
127d0 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
127e0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
127f0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
12800 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
12810 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
12820 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
12830 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
12840 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
12850 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12860 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
12870 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
12880 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
12890 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
128a0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
128b0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
128c0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
128d0 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
128e0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
128f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
12900 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
12910 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
12920 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
12930 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
12940 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
12950 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
12960 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
12970 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
12980 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
12990 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
129a0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
129b0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
129c0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
129d0 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
129e0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
129f0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
12a00 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
12a10 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
12a20 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
12a30 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
12a40 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
12a50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12a60 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
12a70 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
12a80 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
12a90 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
12aa0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
12ab0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
12ac0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12ad0 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
12ae0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
12af0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
12b00 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
12b10 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
12b20 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
12b30 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
12b40 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
12b50 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
12b60 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
12b70 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
12b80 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
12b90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12bb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12bc0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
12bd0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12be0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12bf0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12c00 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12c10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
12c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
12c30 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
12c40 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
12c50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
12c60 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
12c70 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
12c80 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
12c90 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
12ca0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12cb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12cc0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
12cd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
12ce0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
12cf0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
12d00 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
12d10 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
12d20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
12d30 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
12d40 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
12d50 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
12d60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12d70 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
12d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12d90 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
12da0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
12db0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
12dc0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
12dd0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
12de0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
12df0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
12e00 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
12e10 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
12e20 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
12e30 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
12e40 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12e50 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
12e60 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
12e70 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
12e80 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
12e90 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
12ea0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
12eb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
12ec0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12ed0 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
12ee0 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
12ef0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
12f00 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
12f10 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
12f20 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
12f30 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
12f40 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
12f50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12f60 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12f70 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
12f80 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
12f90 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
12fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12fb0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
12fc0 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
12fd0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12fe0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12ff0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
13000 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13010 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13020 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
13040 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
13050 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13060 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
13070 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
13080 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
13090 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
130a0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
130b0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
130c0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
130d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
130e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
130f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13100 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13110 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
13120 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
13130 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
13140 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
13150 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
13160 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
13170 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
13180 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
13190 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
131a0 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
131b0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
131c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
131d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
131e0 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
131f0 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
13200 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
13210 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13220 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
13230 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
13240 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
13250 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
13260 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
13270 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
13280 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
13290 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
132a0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
132b0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
132c0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
132d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
132e0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
132f0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
13300 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
13310 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13320 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13330 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
13340 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
13350 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
13360 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
13370 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
13380 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
13390 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
133a0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
133b0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
133c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
133d0 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
133e0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
133f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13400 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
13410 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
13420 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
13430 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
13440 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
13450 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
13460 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
13470 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
13480 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
13490 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
134a0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
134b0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
134c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
134d0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
134e0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
134f0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13500 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
13510 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
13520 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
13530 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
13540 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
13550 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
13560 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
13570 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
13580 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
13590 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
135a0 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
135b0 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
135c0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
135d0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
135e0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
135f0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
13600 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
13610 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
13620 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
13630 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
13640 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
13650 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
13660 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
13670 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
13680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13690 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
136a0 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
136b0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
136c0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
136d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
136e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
136f0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13700 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
13710 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
13720 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
13730 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
13740 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
13750 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
13760 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
13770 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
13780 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
13790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
137a0 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
137b0 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
137c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
137d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
137e0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
137f0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
13800 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
13810 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13820 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
13830 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13840 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13850 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13860 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
13890 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
138a0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
138b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
138c0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
138d0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
138e0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
138f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
13900 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
13910 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
13920 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
13930 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
13940 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
13950 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
13960 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69  ctRow > (u64)nLi
13970 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  mit .      ){.  
13980 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
13990 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  Row = nLimit;.  
139a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
139b0 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
139c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
139d0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
139e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
139f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13a00 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
13a10 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
13a20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
13a30 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
13a40 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
13a50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13a60 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
13a70 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
13a80 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
13a90 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
13aa0 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
13ab0 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
13ac0 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
13ad0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
13ae0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
13af0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
13b00 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
13b10 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
13b20 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
13b30 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
13b40 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
13b50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
13b60 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
13b70 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
13b80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13b90 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
13ba0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13bb0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
13bc0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
13bd0 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
13be0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
13bf0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
13c00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
13c10 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
13c20 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
13c30 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
13c40 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
13c50 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
13c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
13c70 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
13c80 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
13c90 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
13ca0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
13cb0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13cc0 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
13cd0 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
13ce0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
13cf0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
13d00 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
13d10 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
13d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13d30 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
13d40 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
13d50 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
13d60 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
13d70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
13d80 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
13d90 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
13da0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
13db0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13dc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13dd0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
13de0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
13df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13e00 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
13e10 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
13e20 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
13e30 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
13e40 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
13e50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
13e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
13e80 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
13e90 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
13ea0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
13eb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13ec0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
13ed0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
13ee0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
13ef0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
13f00 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
13f10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
13f20 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
13f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
13f40 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
13f50 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
13f60 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
13f70 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13f80 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
13f90 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13fa0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13fb0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13fc0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
13fd0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
13fe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
13ff0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14000 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14010 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14020 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14030 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
14040 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14050 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14060 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
14070 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
14080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14090 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
140a0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
140b0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
140c0 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
140d0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
140e0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
140f0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
14100 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14110 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14120 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14130 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14140 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
14150 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
14160 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14170 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
14180 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14190 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
141a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
141b0 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
141c0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
141d0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
141e0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
141f0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
14200 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
14210 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
14220 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
14230 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
14240 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
14250 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
14260 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
14270 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
14280 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
14290 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
142a0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
142b0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
142c0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
142d0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
142e0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
142f0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
14300 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14310 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
14320 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
14330 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
14340 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14350 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
14360 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14370 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
14380 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
14390 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
143a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
143b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
143c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
143d0 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
143e0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
143f0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
14400 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
14410 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
14420 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
14430 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
14440 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
14450 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
14460 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
14470 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
14480 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
14490 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
144a0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
144b0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
144c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
144d0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
144e0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
144f0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
14500 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
14510 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
14520 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
14530 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
14540 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
14550 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
14560 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
14570 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
14580 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
14590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
145a0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
145b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
145c0 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
145d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
145e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
145f0 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
14600 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14610 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
14620 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14630 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
14640 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
14650 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
14660 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14670 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
14680 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14690 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
146a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
146b0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
146c0 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20  st, unionTab,.  
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
146f0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
14700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14710 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14720 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
14730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14750 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
14760 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
14770 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
14780 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14790 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
147a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
147b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
147c0 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
147d0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
147e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
147f0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
14800 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
14810 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
14820 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
14830 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
14840 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
14850 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
14860 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
14870 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
14880 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
14890 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
148a0 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
148b0 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
148c0 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
148d0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
148e0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
148f0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
14900 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
14910 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
14920 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
14930 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
14940 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
14950 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
14960 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
14970 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
14980 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14990 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
149a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
149b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
149c0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
149d0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
149e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14a00 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
14a10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
14a20 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
14a30 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
14a40 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14a50 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e   addr;.      fin
14a60 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
14a70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
14a80 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
14a90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14aa0 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
14ab0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
14ac0 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
14ad0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
14ae0 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
14af0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
14b00 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14b10 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
14b20 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
14b30 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
14b40 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
14b50 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14b60 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14b70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14b80 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
14b90 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
14ba0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14bc0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14bd0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
14be0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
14bf0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
14c00 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
14c10 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
14c20 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
14c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14c40 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14c50 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
14c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14c70 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
14c80 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14c90 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14ca0 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
14cb0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14cc0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
14cd0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
14ce0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14cf0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
14d00 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
14d10 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
14d20 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
14d30 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74  dest.iSDParm = t
14d40 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab2;.      expla
14d50 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14d60 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14d70 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14d90 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14da0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
14db0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14dd0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
14de0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
14df0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
14e00 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
14e10 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
14e20 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
14e30 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
14e40 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
14e50 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
14e60 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14e70 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
14e80 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14e90 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
14ea0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
14eb0 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
14ec0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14ed0 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
14ee0 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
14ef0 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
14f00 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
14f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
14f20 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
14f30 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
14f40 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14f50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
14f60 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
14f70 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14f80 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
14f90 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
14fa0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14fb0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
14fc0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
14fd0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
14fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ff0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
15000 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
15010 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
15020 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15030 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
15040 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
15050 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
15060 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
15070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15080 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
15090 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
150a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
150b0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
150c0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
150d0 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  se);.      iStar
150e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
150f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
15100 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ey, tab1, r1);. 
15110 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15120 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
15130 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
15140 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56  iCont, r1, 0); V
15150 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15160 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15170 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15180 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
15190 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
151a0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
151b0 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  ist, tab1,.     
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
151e0 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
151f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15200 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15210 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
15220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15230 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
15240 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
15250 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15260 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15270 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
15280 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
15290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
152a0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
152b0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
152c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
152d0 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
152e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
152f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
15300 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
15310 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
15320 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
15330 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
15340 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
15350 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
15360 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
15370 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
15380 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
15390 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
153a0 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
153b0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
153c0 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
153d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
153e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
153f0 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
15400 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15410 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15420 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
15430 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
15440 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
15450 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
15460 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
15470 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
15480 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
15490 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
154a0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
154b0 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
154c0 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
154d0 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
154e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
154f0 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
15500 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
15510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15520 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15530 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15540 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
15550 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
15560 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
15570 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
15580 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
15590 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
155a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
155b0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
155c0 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
155d0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
155e0 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
155f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
15600 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
15610 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
15620 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
15630 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
15640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15650 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
15660 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
15670 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
15680 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
15690 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
156a0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
156b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
156c0 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
156d0 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
156e0 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
156f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15700 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
15710 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
15720 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
15730 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
15740 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
15750 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
15760 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
15770 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
15780 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
15790 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
157a0 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
157b0 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
157c0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
157d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
157e0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
157f0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
15800 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
15810 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
15820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15830 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
15840 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
15850 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
15860 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
15870 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
15880 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
15890 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
158a0 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
158b0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
158c0 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
158d0 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
158e0 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
158f0 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
15900 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
15910 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
15920 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
15930 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15940 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
15950 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
15960 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
15970 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15980 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
15990 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
159a0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
159b0 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
159e0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
159f0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
15a00 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
15a10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
15a20 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
15a30 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
15a40 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
15a50 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
15a60 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
15a70 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
15a80 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
15a90 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
15aa0 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
15ab0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
15ac0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15ad0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
15ae0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  */../*.** Error 
15af0 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e  message for when
15b00 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
15b10 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  ms of a compound
15b20 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66   select have dif
15b30 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72  ferent.** size r
15b40 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76  esult sets..*/.v
15b50 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
15b60 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72  tWrongNumTermsEr
15b70 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
15b80 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
15b90 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
15ba0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a   & SF_Values ){.
15bb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15bc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
15bd0 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
15be0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
15bf0 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
15c00 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
15c10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15c20 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
15c30 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
15c40 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
15c50 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
15c60 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
15c70 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
15c80 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
15c90 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >op));.  }.}../*
15ca0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
15cb0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
15cc0 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
15cd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15ce0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
15cf0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
15d00 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
15d10 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
15d20 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
15d30 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
15d40 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
15d50 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
15d60 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
15d70 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
15d80 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
15d90 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
15da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15db0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
15dc0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
15dd0 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
15de0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
15df0 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
15e00 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
15e10 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
15e20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
15e30 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
15e40 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
15e50 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
15e60 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
15e70 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
15e80 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
15e90 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
15ea0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
15eb0 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
15ec0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
15ed0 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
15ee0 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
15ef0 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
15f00 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
15f10 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
15f20 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
15f30 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
15f40 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
15f50 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
15f60 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
15f70 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
15f80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
15f90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15fa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15fb0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15fc0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
15fd0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
15fe0 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
15ff0 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
16000 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
16010 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16020 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
16030 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
16040 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
16050 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
16060 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
16070 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
16080 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
16090 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
160a0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
160b0 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
160c0 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
160d0 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
160e0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
160f0 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
16100 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
16110 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
16120 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
16130 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
16140 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
16150 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
16160 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
16170 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
16180 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
16190 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
161a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
161b0 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
161c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
161d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
161e0 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
161f0 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
16200 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
16210 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
16220 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
16230 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
16240 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
16250 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
16260 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
16270 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16280 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
16290 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
162a0 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
162b0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
162c0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
162f0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
16300 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
16310 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
16320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16330 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
16340 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
16350 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  j2+2); VdbeCover
16360 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16370 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16380 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
16390 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
163a0 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
163b0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
163c0 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
163d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
163e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
163f0 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
16400 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
16410 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16420 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
16430 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
16440 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
16450 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
16460 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
16470 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
16480 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
16490 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
164a0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  );..  assert( pD
164b0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
164c0 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65  Exists );.  asse
164d0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
164e0 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  !=SRT_Table );. 
164f0 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
16500 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
16510 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
16520 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
16530 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
16540 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
16550 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
16560 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
16570 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16580 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
16590 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
165a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
165b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
165c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
165d0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
165e0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
165f0 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
16600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16610 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
16620 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16630 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
16640 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16650 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
16660 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
16670 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
16680 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
16690 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
166a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
166b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
166c0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
166d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
166e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
166f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16700 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
16710 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16720 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
16730 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
16740 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
16750 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
16760 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
16770 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
16780 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
16790 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
167a0 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
167b0 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
167c0 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
167d0 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
167e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
167f0 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
16800 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
16810 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16820 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
16830 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 20 20 20  >nErr>0 );.     
16840 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
16850 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
16860 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
16870 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
16880 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
16890 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
168a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
168b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
168c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
168d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
168e0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
168f0 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70  iSdst, 1, r1, &p
16900 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29  Dest->affSdst,1)
16910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16920 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16930 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16940 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20  In->iSdst, 1);. 
16950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
16970 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
16980 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  SDParm, r1);.   
16990 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
169a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
169b0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
169c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
169d0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
169e0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
169f0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
16a00 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
16a10 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
16a20 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
16a30 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
16a40 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
16a50 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
16a60 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
16a70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16a80 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
16a90 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16aa0 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
16ab0 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
16ac0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
16ad0 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
16ae0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
16af0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16b00 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
16b10 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
16b20 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
16b30 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
16b40 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
16b50 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
16b60 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16b70 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
16b80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16b90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
16ba0 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
16bb0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
16bc0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
16bd0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
16be0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
16bf0 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
16c00 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
16c10 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16c20 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
16c30 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
16c40 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
16c50 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
16c60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16c70 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
16c80 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16c90 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
16ca0 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
16cb0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16cc0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
16cd0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16ce0 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
16cf0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16d10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16d20 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
16d30 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
16d40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
16d50 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
16d60 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
16d70 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
16d80 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
16d90 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
16da0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
16db0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
16dc0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
16dd0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
16de0 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
16df0 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
16e00 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
16e10 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
16e20 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
16e30 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
16e40 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16e50 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
16e60 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
16e70 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
16e80 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
16e90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
16ea0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
16eb0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
16ec0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
16ed0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
16ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
16ef0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
16f00 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
16f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16f20 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
16f30 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16f40 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16f50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16f60 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16f70 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
16f80 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16f90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16fa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
16fb0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
16fc0 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
16fd0 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
16fe0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
16ff0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
17000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17010 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
17020 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
17030 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
17040 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
17050 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
17060 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
17070 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
17080 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17090 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
170a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
170b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
170c0 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
170d0 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
170e0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
170f0 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
17100 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
17110 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
17120 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
17130 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17140 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
17150 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
17160 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
17170 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
17180 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
17190 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
171a0 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
171b0 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
171c0 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
171d0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
171e0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
171f0 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
17200 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
17210 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
17220 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
17230 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
17240 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
17250 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
17260 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
17270 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
17280 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
17290 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
172a0 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
172b0 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
172c0 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
172d0 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
172e0 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
172f0 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
17300 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
17310 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
17320 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
17330 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
17340 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
17350 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
17360 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
17370 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
17380 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
17390 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
173a0 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
173b0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
173c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
173d0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
173e0 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
173f0 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
17400 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
17410 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
17420 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
17430 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
17440 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
17450 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
17460 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
17470 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
17480 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
17490 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
174a0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
174b0 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
174c0 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
174d0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
174e0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
174f0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17500 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
17510 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
17520 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
17530 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
17540 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
17550 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
17560 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
17570 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
17580 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
17590 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
175a0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
175b0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
175c0 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
175d0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
175e0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
175f0 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
17600 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
17610 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
17620 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
17630 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
17640 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
17650 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
17660 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
17670 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
17680 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  *          -----
17690 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
176a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
176b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
176c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
176d0 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
176e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
176f0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17700 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17710 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
17720 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
17730 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
17740 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
17750 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
17760 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
17770 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
17780 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
17790 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
177a0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
177b0 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
177c0 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
177d0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
177e0 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
17800 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
17810 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17820 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17830 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
17840 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
17850 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
17860 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
17870 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
17880 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
17890 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
178a0 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
178b0 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
178c0 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
178d0 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
178e0 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
178f0 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
17900 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
17910 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
17920 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
17930 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
17940 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
17950 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17960 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
17970 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
17980 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
17990 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
179a0 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
179b0 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
179c0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
179d0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
179e0 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
179f0 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
17a00 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
17a10 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
17a20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
17a30 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
17a40 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
17a50 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
17a60 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
17a70 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
17a80 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17a90 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
17aa0 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
17ab0 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
17ac0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
17ad0 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
17ae0 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
17af0 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
17b00 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
17b10 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
17b20 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
17b30 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
17b40 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
17b50 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
17b60 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
17b70 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
17b80 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
17b90 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
17ba0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
17bb0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
17bc0 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
17bd0 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
17be0 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
17bf0 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
17c00 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
17c10 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
17c20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
17c30 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
17c40 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
17c50 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
17c60 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
17c70 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
17c80 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
17c90 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17ca0 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
17cb0 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17cc0 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
17cd0 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
17ce0 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
17cf0 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
17d00 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
17d10 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
17d20 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
17d30 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
17d40 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
17d50 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
17d60 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
17d70 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
17d80 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
17d90 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
17da0 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
17db0 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
17dc0 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
17dd0 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
17de0 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
17df0 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
17e00 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
17e10 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
17e20 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
17e30 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
17e40 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
17e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17e60 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
17e70 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
17e80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
17e90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
17ea0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17eb0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
17ec0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
17ed0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
17ee0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
17ef0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
17f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
17f10 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
17f20 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
17f30 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
17f40 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
17f50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17f60 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
17f70 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
17f80 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
17f90 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
17fa0 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
17fb0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
17fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
17fd0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
17fe0 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
17ff0 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
18000 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
18010 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
18020 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18030 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
18040 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
18050 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
18060 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
18070 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18080 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
18090 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
180a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
180b0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
180c0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
180d0 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
180e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
180f0 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
18100 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18110 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
18120 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18130 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
18140 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18150 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
18160 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18170 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
18180 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
18190 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
181a0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
181b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
181c0 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
181d0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
181e0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
181f0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18200 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
18210 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18220 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
18230 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
18240 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
18250 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
18260 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
18270 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
18280 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
18290 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
182a0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
182b0 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
182c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
182d0 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
182e0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
182f0 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
18300 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
18310 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18320 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
18330 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18340 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
18350 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18360 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
18370 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18380 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
18390 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
183a0 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
183b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
183c0 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
183d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
183e0 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
183f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18400 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
18410 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
18420 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
18430 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
18440 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
18450 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
18460 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
18470 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18480 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
18490 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
184a0 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
184b0 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
184c0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
184d0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
184e0 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
184f0 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
18500 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
18510 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
18520 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
18530 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
18540 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
18550 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
18560 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
18570 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
18580 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
18590 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
185a0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
185b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
185c0 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
185d0 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20  mt */.  int j1; 
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185f0 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
18600 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
18610 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
18620 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
18630 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
18640 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
18650 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
18660 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
18670 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
18680 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
18690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
186a0 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
186b0 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
186c0 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
186d0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
186e0 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
186f0 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
18700 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
18710 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
18720 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
18730 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
18740 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
18750 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
18760 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
18770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18780 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
18790 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
187a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
187b0 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
187c0 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
187d0 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
187e0 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
187f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
18800 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
18810 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
18820 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
18830 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
18840 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
18850 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
18860 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
18870 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
18880 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
18890 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
188a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
188b0 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20  KeyDup==0 ); /* 
188c0 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e  "Managed" code n
188d0 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b  eeds this.  Tick
188e0 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64  et #3382. */.  d
188f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18900 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
18910 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
18920 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
18930 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74  Already thrown t
18940 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45  he error if VDBE
18950 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f   alloc failed */
18960 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
18970 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18980 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
18990 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
189a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
189b0 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
189c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
189d0 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
189e0 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
189f0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
18a00 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
18a10 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
18a20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
18a30 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
18a40 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
18a50 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
18a60 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
18a70 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
18a80 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
18a90 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
18aa0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
18ab0 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
18ac0 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
18ad0 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
18ae0 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
18af0 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
18b00 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18b10 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
18b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
18b30 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
18b40 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
18b50 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
18b60 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
18b70 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18b80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18b90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
18ba0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
18bb0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
18bc0 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
18bd0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18be0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
18bf0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18c00 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
18c10 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18c20 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
18c30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18c40 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
18c50 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
18c60 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
18c70 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
18c80 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
18c90 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
18ca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
18cb0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e  OMEM;.        pN
18cc0 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
18cd0 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
18ce0 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
18cf0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f   = i;.        pO
18d00 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
18d10 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
18d20 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
18d30 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
18d40 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
18d50 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
18d60 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
18d70 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
18d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d90 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
18da0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
18db0 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
18dc0 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
18dd0 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
18de0 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
18df0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
18e00 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
18e10 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
18e20 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
18e30 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
18e40 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
18e50 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
18e60 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
18e70 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
18e80 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
18e90 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
18ea0 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
18eb0 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
18ec0 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
18ed0 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
18ee0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
18ef0 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
18f00 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18f10 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
18f20 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20  nt)*nOrderBy);. 
18f30 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
18f40 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
18f50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
18f60 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
18f70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
18f80 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
18f90 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
18fa0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
18fb0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18fc0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
18fd0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18fe0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
18ff0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
19000 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
19010 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
19020 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
19030 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
19040 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
19050 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
19060 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
19070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
19080 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
19090 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
190a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
190b0 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
190c0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
190d0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
190e0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
190f0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
19100 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
19110 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
19120 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19130 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
19140 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
19150 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
19160 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
19170 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
19180 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
19190 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
191a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
191b0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
191c0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
191d0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
191e0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
191f0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
19200 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
19210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19220 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
19230 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19240 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
19250 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
19260 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19270 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
19280 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19290 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
192a0 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
192b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
192c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
192d0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
192e0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
192f0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
19300 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
19310 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
19320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19330 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
19340 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
19350 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
19360 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
19370 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
19380 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
19390 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
193a0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
193b0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
193c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
193d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
193e0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
193f0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
19400 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
19410 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
19420 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
19430 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
19440 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
19450 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19460 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
19470 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
19480 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19490 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
194a0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
194b0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
194c0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
194d0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
194e0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
194f0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
19500 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
19510 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
19520 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
19530 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
19540 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
19550 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
19560 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19570 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
19580 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19590 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
195a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
195b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
195c0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
195d0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
195e0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
195f0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
19620 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
19630 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19640 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
19650 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
19660 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
19670 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
19680 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
19690 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
196a0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
196b0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
196c0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
196d0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
196e0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
196f0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
19700 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19710 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
19720 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19730 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
19740 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
19750 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
19760 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
19770 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
19780 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
19790 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
197a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
197b0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
197c0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
197d0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
197e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
197f0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
19800 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
19810 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
19820 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
19830 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
19840 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
19850 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
19860 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
19870 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19880 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
19890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
198a0 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
198b0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
198c0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
198d0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
198e0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
198f0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
19900 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
19910 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
19920 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
19930 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
19940 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
19950 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
19960 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
19970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19980 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19990 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
199a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
199b0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
199c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
199d0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
199e0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
199f0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
19a00 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
19a10 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19a20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19a30 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19a40 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19a50 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
19a60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19a70 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19a80 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19a90 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19aa0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19ab0 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
19ac0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
19ad0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
19ae0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
19af0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
19b00 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
19b10 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19b20 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19b30 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19b40 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19b50 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19b60 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19b70 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19b80 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19b90 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19ba0 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19bc0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19bd0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19be0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19bf0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19c00 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19c10 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19c20 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19c30 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19c40 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19c50 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19c60 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19c70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19c80 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19c90 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19ca0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19cb0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19cc0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19cd0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19ce0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19d10 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19d20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19d30 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19d40 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19d50 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19d60 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19d70 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19d80 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19d90 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19da0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19db0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19dc0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19dd0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19de0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19df0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19e00 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19e10 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19e20 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19e30 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19e40 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19e50 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19e60 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19e70 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19e80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19e90 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19ea0 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19eb0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19ec0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19ed0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19ee0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19ef0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19f00 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19f10 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19f20 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19f30 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19f40 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19f50 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19f60 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19f70 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19f80 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19f90 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19fa0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19fb0 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19fd0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19fe0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19ff0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1a000 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a010 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a020 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1a030 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1a060 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 47   sqlite3VdbeAddG
1a080 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1a090 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1a0a0 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
1a0b0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a  SelectRow;.  }..
1a0c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a0d0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1a0e0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1a0f0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1a100 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1a110 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1a120 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1a130 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1a140 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1a150 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1a160 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1a170 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1a180 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1a190 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1a1a0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1a1b0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1a1c0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1a1d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a1e0 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1a1f0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a200 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1a210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a220 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a230 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1a240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a250 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a260 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1a270 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a280 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a290 64 62 65 41 64 64 47 6f 74 6f 28 76 2c 20 61 64  dbeAddGoto(v, ad
1a2a0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
1a2b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a2c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a2d0 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
1a2e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a2f0 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
1a300 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a310 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = sqlite
1a320 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a330 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1a340 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73  , addrOutA);.  s
1a350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a360 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a370 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1a380 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a390 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a3a0 65 41 64 64 47 6f 74 6f 28 76 2c 20 6c 61 62 65  eAddGoto(v, labe
1a3b0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
1a3c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a3d0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a3e0 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
1a3f0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1a400 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1a410 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
1a420 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1a430 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1a440 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1a450 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
1a460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
1a470 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a480 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
1a490 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1a4a0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
1a4b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a4c0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a4d0 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1a4e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a4f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a500 65 41 64 64 47 6f 74 6f 28 76 2c 20 6c 61 62 65  eAddGoto(v, labe
1a510 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1a520 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a530 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1a540 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1a550 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1a560 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1a570 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1a580 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1a590 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a5a0 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1a5b0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1a5c0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1a5d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a5e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a5f0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1a600 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1a610 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a620 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1a630 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1a640 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a650 74 65 33 56 64 62 65 41 64 64 47 6f 74 6f 28 76  te3VdbeAddGoto(v
1a660 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a670 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1a680 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1a690 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1a6a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a6b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1a6c0 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
1a6d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a6e0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1a6f0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1a700 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a720 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a730 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1a740 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1a750 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1a760 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1a770 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1a780 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a790 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1a7a0 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1a7b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a7c0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1a7d0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1a7e0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1a7f0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1a800 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a810 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1a820 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1a830 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1a860 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1a870 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1a880 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1a890 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1a8a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a8b0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1a8c0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1a8d0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1a8e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a8f0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a900 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1a910 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1a920 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1a930 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a940 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a950 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1a960 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
1a970 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
1a980 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1a990 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1a9a0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
1a9b0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
1a9c0 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
1a9d0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
1a9e0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
1a9f0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
1aa00 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1aa10 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
1aa20 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1aa30 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1aa40 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1aa50 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1aa60 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1aa70 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1aa80 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1aa90 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1aaa0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1aab0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1aac0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1aad0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1aae0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1aaf0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1ab00 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1ab10 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1ab20 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1ab30 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1ab40 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1ab50 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1ab60 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1ab70 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1ab80 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1ab90 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  , 0);.  return p
1aba0 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1abb0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1abc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1abd0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1abe0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1abf0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
1ac00 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
1ac10 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
1ac20 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1ac30 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
1ac40 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
1ac50 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1ac60 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
1ac70 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
1ac80 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
1ac90 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
1aca0 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1acb0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1acc0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1acd0 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1ace0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1acf0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1ad00 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1ad10 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1ad20 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1ad30 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1ad40 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1ad50 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1ad60 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1ad70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ad80 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1ad90 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1ada0 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1adb0 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1adc0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1add0 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1ade0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1adf0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1ae00 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1ae10 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1ae20 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1ae30 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1ae40 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1ae50 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1ae60 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
1ae70 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
1ae80 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
1ae90 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
1aea0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
1aeb0 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
1aec0 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
1aed0 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
1aee0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
1aef0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  ry..*/.static Ex
1af00 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20  pr *substExpr(. 
1af10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1af20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1af30 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
1af40 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1af50 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1af60 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
1af70 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1af80 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1af90 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1afa0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1afb0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1afc0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1afd0 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
1afe0 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
1aff0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
1b000 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1b010 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1b020 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1b030 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1b040 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
1b050 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1b060 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1b070 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1b080 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1b090 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1b0a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b0b0 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1b0c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
1b0d0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1b0e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b0f0 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
1b100 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1b110 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
1b120 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1b130 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
1b140 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1b150 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1b160 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1b170 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1b180 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1b190 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1b1a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
1b1b0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1b1c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
1b1d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b1e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1b1f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b200 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54  Expr->pRight, iT
1b210 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b220 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1b230 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b240 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1b250 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1b260 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  (db, pExpr->x.pS
1b270 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b280 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  EList);.    }els
1b290 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  e{.      substEx
1b2a0 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72  prList(db, pExpr
1b2b0 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c  ->x.pList, iTabl
1b2c0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b2d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1b2e0 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1b2f0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1b300 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1b310 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1b320 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b330 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
1b340 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1b350 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
1b360 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
1b370 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
1b380 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
1b390 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1b3a0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1b3b0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1b3c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1b3d0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
1b3e0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
1b3f0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1b400 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1b410 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1b420 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1b430 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
1b440 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
1b450 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
1b460 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20  .pExpr, iTable, 
1b470 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73  pEList);.  }.}.s
1b480 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1b490 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Select(.  sqlite
1b4a0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1b4b0 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b4c0 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1b4d0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1b4e0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1b4f0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1b500 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1b510 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1b520 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1b530 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1b540 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20  e replaced */.  
1b550 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1b560 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
1b570 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a  te values */.){.
1b580 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1b590 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b5a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1b5b0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70   int i;.  if( !p
1b5c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
1b5d0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b5e0 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
1b5f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
1b600 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b610 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62  ->pGroupBy, iTab
1b620 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1b630 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b640 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54   p->pOrderBy, iT
1b650 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b660 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1b670 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
1b680 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
1b690 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57  pEList);.  p->pW
1b6a0 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1b6b0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
1b6c0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b6d0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
1b6e0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
1b6f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b700 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1b710 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1b720 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20  );  /* Even for 
1b730 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61  (SELECT 1) we ha
1b740 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20  ve: pSrc!=0 but 
1b750 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f  pSrc->nSrc==0 */
1b760 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
1b770 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  rc) ){.    for(i
1b780 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1b790 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1b7a0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1b7b0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b7c0 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
1b7d0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1b7e0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1b7f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1b800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1b810 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1b820 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b830 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1b840 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1b850 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1b860 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1b870 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1b880 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b890 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1b8a0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1b8b0 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1b8c0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1b8d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b8e0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1b8f0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1b900 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1b910 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1b920 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1b930 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1b940 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1b950 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1b960 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1b970 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1b980 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1b990 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1b9a0 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1b9b0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1b9c0 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1b9d0 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1b9e0 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1b9f0 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1ba00 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1ba10 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1ba20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1ba30 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1ba40 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ba50 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1ba60 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1ba70 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1ba80 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1ba90 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1baa0 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1bab0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bac0 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1bad0 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1bae0 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1baf0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1bb00 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1bb10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1bb20 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1bb30 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1bb40 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1bb50 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1bb60 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1bb70 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1bb80 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1bb90 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1bba0 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1bbb0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1bbc0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1bbd0 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1bbe0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1bbf0 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1bc00 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1bc10 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1bc20 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1bc30 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1bc40 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1bc50 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1bc60 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1bc70 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1bc80 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1bc90 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
1bca0 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
1bcb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1bcc0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1bcd0 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
1bce0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1bcf0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1bd00 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
1bd10 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
1bd20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1bd30 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1bd40 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75  e or (2a) the ou
1bd50 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1bd60 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20   a join.**      
1bd70 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f    and (2b) the o
1bd80 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1bd90 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69  not use subqueri
1bda0 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1bdb0 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
1bdc0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1bdd0 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1bde0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61  andidate for fla
1bdf0 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73  ttening.  (2b is
1be00 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74  .**        due t
1be10 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1be20 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f  d73bf9abf80] fro
1be30 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a  m 2015-02-09.).*
1be40 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
1be50 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1be60 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1be70 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
1be80 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
1be90 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
1bea0 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
1beb0 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65  gthened by ticke
1bec0 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
1bed0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1bee0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
1bef0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  CT..**.**  (**) 
1bf00 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65   At one point re
1bf10 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61  strictions (4) a
1bf20 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61  nd (5) defined a
1bf30 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49   subset of DISTI
1bf40 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  NCT.**        su
1bf50 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77  b-queries that w
1bf60 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  ere excluded fro
1bf70 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  m this optimizat
1bf80 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e  ion. Restriction
1bf90 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20   .**        (4) 
1bfa0 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65  has since been e
1bfb0 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75  xpanded to exclu
1bfc0 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20  de all DISTINCT 
1bfd0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  subqueries..**.*
1bfe0 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
1bff0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c000 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1c010 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c020 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1c030 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
1c040 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1c050 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
1c060 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1c070 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1c080 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1c090 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1c0a0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1c0b0 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69   a FROM close wi
1c0c0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1c0d0 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1c0e0 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1c0f0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1c100 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1c110 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1c120 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1c130 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
1c140 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c150 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1c160 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c170 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
1c180 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
1c190 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c1a0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1c1b0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1c1c0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1c1d0 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
1c1e0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74  *.**  (**)  Rest
1c1f0 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73  riction (10) was
1c200 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1c210 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30  e code on 2005-0
1c220 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20  2-05 but we.**  
1c230 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79        accidently
1c240 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d   carried the com
1c250 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74  ment forward unt
1c260 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20  il 2014-09-15.  
1c270 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  Original.**     
1c280 20 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75     text: "The su
1c290 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c2a0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
1c2b0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c2c0 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65  y .**        doe
1c2d0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  s not use LIMIT.
1c2e0 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1c2f0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c300 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c310 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
1c320 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c330 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1c340 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1c350 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1c360 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1c370 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1c380 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1c390 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1c3a0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1c3b0 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1c3c0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
1c3d0 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
1c3e0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1c3f0 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  th use LIMIT..**
1c400 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
1c410 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c420 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
1c430 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
1c440 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c450 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1c460 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
1c470 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
1c480 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
1c490 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
1c4a0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
1c4b0 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1c4c0 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1c4d0 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1c4e0 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
1c4f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1c500 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
1c510 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
1c520 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
1c530 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
1c540 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
1c550 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
1c560 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
1c570 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
1c580 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
1c590 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
1c5a0 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
1c5b0 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
1c5c0 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
1c5d0 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
1c5e0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
1c5f0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1c600 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
1c610 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
1c620 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1c630 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
1c640 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
1c650 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1c660 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
1c670 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
1c680 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
1c690 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c6a0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1c6b0 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
1c6c0 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
1c6d0 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20       * is not a 
1c6e0 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  join.**.**      
1c6f0 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1c700 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1c710 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1c720 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1c730 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1c740 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1c750 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1c760 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1c770 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1c780 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1c790 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1c7a0 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1c7b0 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1c7c0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1c7d0 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1c7e0 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1c7f0 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1c800 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c810 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1c820 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1c830 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1c840 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1c850 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1c860 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1c870 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1c880 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1c890 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1c8a0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1c8b0 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1c8c0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1c8d0 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1c8e0 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1c8f0 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1c900 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1c910 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1c920 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1c930 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1c940 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1c950 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1c960 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1c970 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1c980 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1c990 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1c9a0 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1c9b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1c9c0 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1c9d0 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1c9e0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1c9f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1ca00 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1ca10 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1ca20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
1ca30 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1ca40 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1ca50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1ca60 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1ca70 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1ca80 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1ca90 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1caa0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1cab0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1cac0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1cad0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
1cae0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
1caf0 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
1cb00 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1cb10 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1cb20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
1cb30 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1cb40 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1cb50 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
1cb60 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
1cb70 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
1cb80 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
1cb90 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
1cba0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
1cbb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1cbc0 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
1cbd0 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
1cbe0 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
1cbf0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
1cc00 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
1cc10 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
1cc20 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
1cc30 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
1cc40 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
1cc50 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
1cc60 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1cc70 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1cc80 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1cc90 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1cca0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1ccb0 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
1ccc0 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
1ccd0 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73  .**  (22)  The s
1cce0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1ccf0 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a   recursive CTE..
1cd00 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65  **.**  (23)  The
1cd10 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61   parent is not a
1cd20 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1cd30 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  or the sub-query
1cd40 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20   is not a.**    
1cd50 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65      compound que
1cd60 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1cd70 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1cd80 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1cd90 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1cda0 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1cdb0 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1cdc0 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1cdd0 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1cde0 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1cdf0 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1ce00 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20  )..**.**  (24)  
1ce10 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1ce20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1ce30 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62   that uses the b
1ce40 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72  uilt-in min() or
1ce50 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d   .**        or m
1ce60 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ax() functions. 
1ce70 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72   (Without this r
1ce80 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75  estriction, a qu
1ce90 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20  ery like:.**    
1cea0 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52      "SELECT x FR
1ceb0 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79  OM (SELECT max(y
1cec0 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77  ), x FROM t1)" w
1ced0 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61  ould not necessa
1cee0 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  rily.**        r
1cef0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1cf00 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61  X for which Y wa
1cf10 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a  s maximal.).**.*
1cf20 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
1cf30 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
1cf40 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
1cf50 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
1cf60 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
1cf70 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
1cf80 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
1cf90 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
1cfa0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cfb0 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
1cfc0 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
1cfd0 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
1cfe0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1cff0 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
1d000 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
1d010 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
1d020 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
1d030 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
1d040 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
1d050 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1d060 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
1d070 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1d080 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
1d090 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
1d0a0 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
1d0b0 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
1d0c0 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
1d0d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
1d0e0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1d0f0 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
1d100 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
1d110 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
1d120 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1d130 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1d140 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1d150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d160 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
1d170 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
1d180 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
1d190 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
1d1a0 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
1d1b0 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
1d1c0 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
1d1d0 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
1d1e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d1f0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
1d200 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d210 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1d220 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
1d230 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1d240 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1d250 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d260 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
1d270 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1d280 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1d290 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1d2a0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1d2b0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  t;.  Select *pSu
1d2c0 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
1d2d0 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
1d2e0 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
1d2f0 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
1d300 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d310 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
1d320 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
1d330 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1d340 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
1d350 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d360 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d370 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1d380 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
1d390 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d3a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1d3b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1d3c0 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
1d3d0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1d3e0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d3f0 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
1d400 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1d410 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1d420 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
1d430 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
1d440 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1d450 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1d460 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
1d470 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1d480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d490 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d4a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1d4b0 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
1d4c0 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
1d4d0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1d4e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d4f0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
1d500 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
1d510 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1d520 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
1d530 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
1d540 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
1d550 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
1d560 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
1d570 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
1d580 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
1d590 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1d5a0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1d5b0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
1d5c0 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
1d5d0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
1d5e0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d5f0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
1d600 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
1d610 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
1d620 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
1d630 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
1d640 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
1d650 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
1d660 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1d670 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
1d680 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75  0 );.  if( subqu
1d690 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1d6a0 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75  if( isAgg ) retu
1d6b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d6e0 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20  ion (1)   */.   
1d6f0 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e   if( pSrc->nSrc>
1d700 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d730 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20  tion (2a)  */.  
1d740 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65    if( (p->pWhere
1d750 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1d760 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50  rty(p->pWhere,EP
1d770 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20  _Subquery)).    
1d780 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1d790 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c  ListFlags(p->pEL
1d7a0 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65  ist) & EP_Subque
1d7b0 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28  ry)!=0.     || (
1d7c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1d7d0 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79  lags(p->pOrderBy
1d7e0 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29  ) & EP_Subquery)
1d7f0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1d800 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d840 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20  on (2b)  */.    
1d850 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75  }.  }.    .  pSu
1d860 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1d870 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
1d880 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
1d890 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
1d8a0 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
1d8b0 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
1d8c0 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
1d8d0 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
1d8e0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1d8f0 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
1d900 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
1d910 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
1d920 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
1d930 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
1d940 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
1d950 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
1d960 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1d970 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
1d980 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1d990 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
1d9a0 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
1d9b0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
1d9c0 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
1d9d0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d9e0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
1d9f0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1da00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1da10 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
1da20 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
1da30 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
1da40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1da60 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
1da70 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1da80 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75  lags & SF_Compou
1da90 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e  nd)!=0 && pSub->
1daa0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
1dab0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1daf0 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
1db00 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1db10 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1db40 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
1db50 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1db60 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1db70 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1db80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1db90 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
1dba0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dbb0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
1dbc0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
1dbd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1dbe0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dbf0 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
1dc00 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1dc10 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1dc20 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
1dc30 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1dc40 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1dc50 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dc60 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
1dc70 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1dc80 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1dc90 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
1dca0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcd0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dce0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
1dcf0 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
1dd00 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
1dd10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dd20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd30 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
1dd40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dd50 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
1dd60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dd70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd80 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
1dd90 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dda0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1ddb0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
1ddc0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1ddd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dde0 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
1ddf0 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
1de00 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1de10 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b   SF_Recursive );
1de20 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1de30 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1de40 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20  _MinMaxAgg );.  
1de50 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1de60 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
1de70 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29  ve|SF_MinMaxAgg)
1de80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1de90 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
1dea0 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20  s (22) and (24) 
1deb0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1dec0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1ded0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1dee0 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
1def0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
1df00 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a  striction (23) *
1df10 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f  /.  }..  /* OBSO
1df20 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
1df30 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1df40 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
1df50 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
1df60 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1df70 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
1df80 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
1df90 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1dfa0 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
1dfb0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
1dfc0 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
1dfd0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1dfe0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1dff0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1e000 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
1e010 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1e020 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1e030 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1e040 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1e050 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e060 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
1e070 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
1e080 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
1e090 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
1e0a0 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
1e0b0 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
1e0c0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
1e0d0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1e0e0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
1e0f0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1e100 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
1e110 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1e120 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
1e130 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
1e140 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
1e150 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
1e160 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1e170 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1e180 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1e190 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1e1a0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
1e1b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1e1c0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1e1d0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1e1e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e1f0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1e200 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
1e210 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
1e220 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
1e230 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
1e240 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
1e250 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
1e260 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
1e270 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
1e280 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
1e290 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
1e2a0 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
1e2b0 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
1e2c0 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
1e2d0 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
1e2e0 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
1e2f0 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
1e300 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
1e310 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
1e320 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
1e330 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
1e340 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
1e350 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
1e360 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1e370 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
1e380 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1e390 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
1e3a0 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
1e3b0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
1e3c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e3d0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
1e3e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1e3f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1e400 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
1e410 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1e420 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
1e430 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
1e440 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
1e450 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
1e460 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
1e470 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
1e480 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
1e490 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
1e4a0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
1e4b0 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
1e4c0 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
1e4d0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
1e4e0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1e4f0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1e500 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1e510 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e520 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
1e530 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
1e540 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
1e550 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e560 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1e570 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
1e580 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e590 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1e5a0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
1e5b0 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
1e5c0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
1e5d0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1e5e0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1e5f0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1e600 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
1e610 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1e620 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1e630 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e640 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e650 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
1e660 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
1e670 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
1e680 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rc!=0 );.      a
1e690 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c  ssert( pSub->pEL
1e6a0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62  ist->nExpr==pSub
1e6b0 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1e6c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1e6d0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1e6e0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1e6f0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
1e700 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1e710 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1e720 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
1e730 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1e740 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
1e750 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
1e760 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1e770 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e780 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1e790 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  rc>1 );.    }.. 
1e7a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e7b0 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
1e7c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1e7d0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1e7e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1e7f0 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
1e800 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
1e810 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1e820 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
1e830 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
1e840 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e850 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1e860 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
1e870 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
1e880 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1e890 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20  itted. *****/.  
1e8a0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
1e8b0 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e  arse,p,("flatten
1e8c0 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d   %s.%p from term
1e8d0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
1e8e0 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d             pSub-
1e8f0 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c  >zSelName, pSub,
1e900 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20   iFrom));..  /* 
1e910 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
1e920 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
1e930 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1e940 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
1e950 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69  me;.  TESTONLY(i
1e960 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43   =) sqlite3AuthC
1e970 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e980 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1e990 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65  , 0);.  testcase
1e9a0 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  ( i==SQLITE_DENY
1e9b0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   );.  pParse->zA
1e9c0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
1e9d0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
1e9e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
1e9f0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1ea00 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
1ea10 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
1ea20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
1ea30 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
1ea40 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
1ea50 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
1ea60 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
1ea70 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
1ea80 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
1ea90 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
1eaa0 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
1eab0 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
1eac0 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
1ead0 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
1eae0 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
1eaf0 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
1eb00 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
1eb10 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
1eb20 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
1eb30 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
1eb40 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
1eb50 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1eb60 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
1eb70 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
1eb80 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
1eb90 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
1eba0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
1ebb0 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
1ebc0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
1ebd0 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
1ebe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
1ebf0 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
1ec00 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
1ec10 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
1ec20 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
1ec30 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
1ec40 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ec50 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
1ec60 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
1ec70 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1ec80 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ec90 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1eca0 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
1ecb0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
1ecc0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
1ecd0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
1ece0 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
1ecf0 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
1ed00 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1ed10 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
1ed20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
1ed30 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
1ed40 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
1ed50 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
1ed60 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1ed70 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
1ed80 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
1ed90 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
1eda0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
1edb0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
1edc0 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
1edd0 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
1ede0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
1edf0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
1ee00 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
1ee10 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1ee20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
1ee30 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
1ee40 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
1ee50 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ee60 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
1ee70 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
1ee80 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
1ee90 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1eea0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
1eeb0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45  p->pLimit;.    E
1eec0 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70  xpr *pOffset = p
1eed0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53  ->pOffset;.    S
1eee0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
1eef0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
1ef00 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1ef10 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
1ef20 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
1ef30 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
1ef40 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f  t = 0;.    p->pO
1ef50 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1ef60 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
1ef70 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29  ectDup(db, p, 0)
1ef80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1ef90 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
1efa0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29   pSub->zSelName)
1efb0 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1efc0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
1efd0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
1efe0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
1eff0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1f000 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
1f010 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
1f020 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
1f030 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1f040 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1f050 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
1f060 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
1f070 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1f080 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
1f090 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1f0a0 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
1f0b0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
1f0c0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1f0d0 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
1f0e0 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
1f0f0 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f  p,.         ("co
1f100 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1f110 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65  flattener create
1f120 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c  s %s.%p as peer\
1f130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65  n",.         pNe
1f140 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65  w->zSelName, pNe
1f150 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w));.    }.    i
1f160 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1f170 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1f180 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1f190 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
1f1a0 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
1f1b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f1c0 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
1f1d0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
1f1e0 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
1f1f0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1f200 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
1f210 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
1f220 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
1f230 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1f240 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1f250 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
1f260 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f270 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1f280 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f290 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
1f2a0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1f2b0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f2c0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
1f2d0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1f2e0 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
1f2f0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
1f300 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1f310 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
1f320 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
1f330 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
1f340 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
1f350 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
1f360 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1f370 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
1f380 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
1f390 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
1f3a0 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
1f3b0 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
1f3c0 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
1f3d0 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
1f3e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
1f3f0 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
1f400 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
1f410 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
1f420 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
1f430 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
1f440 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
1f450 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
1f460 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
1f470 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
1f480 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
1f490 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
1f4a0 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
1f4b0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
1f4c0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
1f4d0 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
1f4e0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1f4f0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1f500 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f510 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
1f520 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
1f530 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
1f540 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1f550 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
1f560 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
1f570 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
1f580 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  Del->nRef--;.   
1f590 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
1f5a0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
1f5b0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f5c0 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
1f5d0 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
1f5e0 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
1f5f0 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
1f600 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
1f610 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
1f620 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1f630 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
1f640 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
1f650 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
1f660 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
1f670 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
1f680 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
1f690 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
1f6a0 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
1f6b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
1f6c0 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
1f6d0 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
1f6e0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
1f6f0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
1f700 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1f710 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1f720 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
1f730 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
1f740 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
1f750 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
1f760 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
1f770 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
1f780 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
1f790 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
1f7a0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
1f7b0 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
1f7c0 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
1f7d0 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
1f7e0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
1f7f0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
1f800 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
1f810 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
1f820 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
1f830 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1f840 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
1f850 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
1f860 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
1f870 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
1f880 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
1f890 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
1f8a0 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
1f8b0 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
1f8c0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
1f8d0 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
1f8e0 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
1f8f0 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
1f900 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
1f910 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1f920 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
1f930 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
1f940 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
1f950 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
1f960 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
1f970 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1f980 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1f990 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1f9a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1f9b0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
1f9c0 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
1f9d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f9e0 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
1f9f0 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
1fa00 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1fa10 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
1fa20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1fa30 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1fa40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fa50 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1fa60 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1fa70 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1fa80 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1fa90 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1faa0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1fab0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1fac0 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1fad0 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1fae0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1faf0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1fb00 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1fb10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fb20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1fb30 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1fb40 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1fb50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fb60 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1fb70 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1fb80 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1fb90 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1fba0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1fbb0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1fbc0 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1fbd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1fbe0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1fbf0 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1fc00 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1fc10 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1fc20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1fc30 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1fc40 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1fc50 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1fc60 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1fc70 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1fc80 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1fc90 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1fca0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1fcb0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1fcc0 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1fcd0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1fce0 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1fcf0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1fd00 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1fd10 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1fd20 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1fd30 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1fd40 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1fd50 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1fd60 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1fd70 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1fd80 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1fd90 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1fda0 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1fdb0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1fdc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1fdd0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1fde0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1fdf0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1fe00 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1fe10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1fe20 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1fe30 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1fe40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1fe50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1fe60 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1fe70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fe80 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1fe90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fea0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1feb0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1fec0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1fed0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1fee0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1fef0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1ff00 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1ff10 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1ff20 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1ff30 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1ff40 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1ff50 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1ff60 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1ff70 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1ff80 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1ff90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1ffa0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
1ffb0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
1ffc0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
1ffd0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
1ffe0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
1fff0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
20000 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
20010 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20020 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
20030 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
20040 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
20050 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
20060 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
20070 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
20080 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
20090 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
200a0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
200b0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
200c0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
200d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
200e0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
200f0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
20100 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
20110 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
20120 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
20130 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20140 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
20150 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
20160 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
20170 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20180 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
20190 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
201a0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
201b0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
201c0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
201d0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
201e0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
201f0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
20200 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
20210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
20220 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
20230 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
20240 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
20250 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
20260 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
20270 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c  3DbStrDup(db, pL
20280 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
20290 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
202a0 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
202b0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
202c0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  a[i].zName = zNa
202d0 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
202e0 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  }.    substExprL
202f0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20300 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
20310 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20320 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
20330 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
20340 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
20350 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  t->pGroupBy, iPa
20360 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
20370 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
20380 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
20390 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
203a0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
203b0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
203c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
203d0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
203e0 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  By ){.      /* A
203f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e  t this point, an
20400 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65  y non-zero iOrde
20410 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e  rByCol values in
20420 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
20430 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
20440 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  Y column express
20450 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c  ion is identical
20460 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79   to the iOrderBy
20470 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20  Col'th.      ** 
20480 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
20490 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74  ned by SELECT st
204a0 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69  atement pSub. Si
204b0 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  nce these values
204c0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
204d0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72   necessarily cor
204e0 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d  respond to colum
204f0 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  ns in SELECT sta
20500 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a  tement pParent,.
20510 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68        ** zero th
20520 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66  em before transf
20530 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ering the ORDER 
20540 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
20550 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
20560 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20   doing this may 
20570 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69  cause an error i
20580 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  f a subsequent c
20590 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
205a0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74    ** function at
205b0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
205c0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  n a compound sub
205d0 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72  -query into pPar
205e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  ent.      ** (th
205f0 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20  e only way this 
20600 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66  can happen is if
20610 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
20620 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20  b-query is.     
20630 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61   ** currently pa
20640 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63  rt of pSub->pSrc
20650 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64  ). See ticket [d
20660 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a  11a6e908f].  */.
20670 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20680 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
20690 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
206a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
206b0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
206c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
206d0 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
206e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
206f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
20700 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
20710 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
20720 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
20730 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
20740 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
20750 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
20760 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
20770 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
20780 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
20790 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
207a0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
207b0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
207c0 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
207d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
207e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
207f0 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
20800 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
20810 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
20820 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
20830 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
20840 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
20850 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
20860 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
20870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20880 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
20890 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
208a0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
208b0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
208c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
208d0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
208e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
208f0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
20900 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
20910 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
20920 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20930 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20940 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
20950 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
20960 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
209a0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
209b0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
209c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
209d0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
209e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
209f0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
20a00 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
20a10 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
20a20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20a30 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20a40 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
20a50 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
20a60 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
20a70 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
20a80 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20a90 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
20aa0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
20ab0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
20ac0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
20ad0 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
20ae0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
20af0 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
20b00 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
20b10 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
20b20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
20b30 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
20b40 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
20b50 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
20b60 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
20b70 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
20b80 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
20b90 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
20ba0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
20bb0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
20bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
20bd0 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
20be0 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
20bf0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
20c00 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
20c10 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
20c20 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
20c30 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
20c40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
20c50 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
20c60 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
20c70 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
20c80 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
20c90 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
20ca0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20cb0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
20cc0 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
20cd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
20ce0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
20cf0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
20d00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
20d10 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
20d20 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
20d30 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
20d40 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
20d50 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
20d60 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
20d70 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
20d80 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22  r flattening:\n"
20d90 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
20da0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
20db0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
20dc0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
20dd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
20de0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20df0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
20e00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20e10 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23  IT_VIEW) */....#
20e20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
20e30 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20e40 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
20e50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
20e60 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
20e70 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
20e80 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
20e90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
20ea0 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
20eb0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
20ec0 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
20ed0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
20ee0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
20ef0 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
20f00 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
20f10 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
20f20 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
20f30 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
20f40 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20f50 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
20f60 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
20f70 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
20f80 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
20f90 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
20fa0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
20fb0 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
20fc0 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
20fd0 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
20fe0 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
20ff0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
21000 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
21010 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
21020 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
21030 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  1) The inner que
21040 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  ry is an aggrega
21050 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61  te.  (In that ca
21060 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20  se, we'd really 
21070 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f  want.**       to
21080 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20   copy the outer 
21090 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72  WHERE-clause ter
210a0 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49  ms onto the HAVI
210b0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  NG clause of the
210c0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20  .**       inner 
210d0 71 75 65 72 79 2e 20 20 42 75 74 20 74 68 65 79  query.  But they
210e0 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20   probably won't 
210f0 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f  help there so do
21100 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a   not bother.).**
21110 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
21120 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
21130 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
21140 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
21150 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
21160 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
21170 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
21180 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
21190 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
211a0 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
211b0 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c        close woul
211c0 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
211d0 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
211e0 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
211f0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21200 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
21210 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
21220 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65  OIN.  (The calle
21230 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72  r.**       enfor
21240 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63  ces this restric
21250 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20  tion since this 
21260 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
21270 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20   have enough.** 
21280 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f        informatio
21290 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a  n to know.).**.*
212a0 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52  *   (5) The WHER
212b0 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
212c0 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69  ion originates i
212d0 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
212e0 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  G clause.**     
212f0 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e    of a LEFT JOIN
21300 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
21310 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
21320 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
21330 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
21340 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
21350 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
21360 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
21370 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
21380 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
21390 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
213a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
213b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
213c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
213d0 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20   (for malloc()) 
213e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
213f0 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  bq,        /* Th
21400 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65  e subquery whose
21410 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
21420 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64   to be augmented
21430 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
21440 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
21450 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21460 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
21470 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ry */.  int iCur
21480 73 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sor           /*
21490 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
214a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
214b0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
214c0 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
214d0 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65   0;.  if( pWhere
214e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
214f0 20 20 69 66 28 20 28 70 53 75 62 71 2d 3e 73 65    if( (pSubq->se
21500 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67  lFlags & (SF_Agg
21510 72 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73  regate|SF_Recurs
21520 69 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ive))!=0 ){.    
21530 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21540 73 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61  strictions (1) a
21550 6e 64 20 28 32 29 20 2a 2f 0a 20 20 7d 0a 20 20  nd (2) */.  }.  
21560 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
21570 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  t!=0 ){.     ret
21580 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
21590 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
215a0 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
215b0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
215c0 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
215d0 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
215e0 64 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72  db, pSubq, pWher
215f0 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73  e->pRight, iCurs
21600 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  or);.    pWhere 
21610 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b  = pWhere->pLeft;
21620 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
21630 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
21640 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  e,EP_FromJoin) )
21650 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
21660 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20  striction 5 */. 
21670 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
21680 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
21690 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29  pWhere, iCursor)
216a0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b   ){.    nChng++;
216b0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62  .    while( pSub
216c0 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  q ){.      pNew 
216d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
216e0 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  (db, pWhere, 0);
216f0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75  .      pNew = su
21700 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65 77  bstExpr(db, pNew
21710 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71  , iCursor, pSubq
21720 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
21730 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
21740 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
21750 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72  db, pSubq->pWher
21760 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
21770 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
21780 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
21790 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
217a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
217b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
217c0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
217d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
217e0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
217f0 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65  .** Based on the
21800 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
21810 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
21820 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
21830 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
21840 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63  ument, this func
21850 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
21860 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
21870 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
21880 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74  * the query cont
21890 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67  ains just a sing
218a0 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  le aggregate fun
218b0 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74  ction,.**    * t
218c0 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
218d0 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ction is either 
218e0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20  min() or max(), 
218f0 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  and.**    * the 
21900 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
21910 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
21920 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
21930 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alue..**.** If a
21940 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
21950 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57  are true, then W
21960 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
21970 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
21980 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75  Y_MAX.** is retu
21990 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69  rned as appropri
219a0 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69  ate. Also, *ppMi
219b0 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70  nMax is set to p
219c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
219d0 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74  list of argument
219e0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
219f0 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65  aggregate before
21a00 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
21a10 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
21a20 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  ditions above ar
21a30 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69  e not met, *ppMi
21a40 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30  nMax is set to 0
21a50 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   and.** WHERE_OR
21a60 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20  DERBY_NORMAL is 
21a70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21a80 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
21a90 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  ry(AggInfo *pAgg
21aa0 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a  Info, ExprList *
21ab0 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
21ac0 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
21ad0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
21ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21af0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70  n value */..  *p
21b00 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69  pMinMax = 0;.  i
21b10 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
21b20 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70  nc==1 ){.    Exp
21b30 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49  r *pExpr = pAggI
21b40 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45  nfo->aFunc[0].pE
21b50 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74  xpr; /* Aggregat
21b60 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
21b70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21b80 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
21b90 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67  ist;      /* Arg
21ba0 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
21bb0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  nction */..    a
21bc0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
21bd0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
21be0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  N );.    if( pEL
21bf0 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
21c00 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
21c10 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
21c20 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
21c30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
21c40 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45  char *zFunc = pE
21c50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
21c60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21c70 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
21c80 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
21c90 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
21ca0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
21cb0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
21cc0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
21cd0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
21ce0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
21cf0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
21d00 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
21d10 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
21d20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
21d30 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
21d40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21d50 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
21d60 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d  x==0 || (*ppMinM
21d70 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ax)->nExpr==1 );
21d80 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
21d90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
21da0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
21db0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
21dc0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
21dd0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
21de0 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
21df0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
21e00 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
21e10 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
21e20 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
21e30 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
21e40 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
21e50 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
21e60 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
21e70 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
21e80 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
21e90 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
21ea0 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
21eb0 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
21ec0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
21ed0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
21ee0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
21ef0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
21f00 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
21f10 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
21f20 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
21f30 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
21f40 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
21f50 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
21f60 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
21f70 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
21f80 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
21f90 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
21fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
21fb0 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
21fc0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
21fd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
21fe0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
21ff0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
22000 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
22010 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
22020 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
22030 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
22040 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
22050 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
22060 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
22070 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
22080 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
22090 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
220a0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
220b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
220c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
220d0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
220e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
220f0 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  ER(pAggInfo->nFu
22100 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  nc==0) ) return 
22110 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
22120 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
22130 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51  nc->funcFlags&SQ
22140 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
22150 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22160 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
22170 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
22180 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
22190 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
221a0 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
221b0 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
221c0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
221d0 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
221e0 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
221f0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
22200 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
22210 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
22220 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
22230 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
22240 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
22250 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
22260 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
22270 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
22280 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
22290 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
222a0 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
222b0 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
222c0 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
222d0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
222e0 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
222f0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
22300 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
22310 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
22320 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
22330 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
22340 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
22350 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
22360 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
22370 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
22380 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e  exedBy = pFrom->
22390 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20  u1.zIndexedBy;. 
223a0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
223b0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
223c0 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
223d0 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
223e0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
223f0 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64  >zName, zIndexed
22400 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49  By); .        pI
22410 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20  dx=pIdx->pNext. 
22420 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70     );.    if( !p
22430 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Idx ){.      sql
22440 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22450 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
22460 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78  dex: %s", zIndex
22470 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  edBy, 0);.      
22480 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
22490 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
224a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
224b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
224c0 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20  rom->pIBIndex = 
224d0 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
224e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
224f0 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d  /*.** Detect com
22500 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
22510 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65  tements that use
22520 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
22530 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20  use with .** an 
22540 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c  alternative coll
22550 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
22560 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22570 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
22580 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
22590 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e  OM t2 ORDER BY .
225a0 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
225b0 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65  .** These are re
225c0 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62  written as a sub
225d0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
225e0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
225f0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22600 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
22610 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20  ... FROM t2).** 
22620 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e      ORDER BY ...
22630 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
22640 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
22650 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  mation is necess
22660 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ary because the 
22670 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
22680 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  By() routine.** 
22690 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72  above that gener
226a0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
226b0 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
226c0 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  ECT with an ORDE
226d0 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75  R BY clause.** u
226e0 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f  ses a merge algo
226f0 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69  rithm that requi
22700 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  res the same col
22710 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22720 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  on the.** result
22730 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74   columns as on t
22740 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
22750 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a  se.  See ticket.
22760 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71  ** http://www.sq
22770 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
22780 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a  o/6709574d2a.**.
22790 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72  ** This transfor
227a0 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e  mation is only n
227b0 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54  eeded for EXCEPT
227c0 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64  , INTERSECT, and
227d0 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55   UNION..** The U
227e0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
227f0 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74  r works fine wit
22800 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  h multiSelectOrd
22810 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e  erBy() even when
22820 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f  .** there are CO
22830 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74  LLATE terms in t
22840 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a  he ORDER BY..*/.
22850 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65  static int conve
22860 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
22870 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65  ToSubquery(Walke
22880 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
22890 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ct *p){.  int i;
228a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
228b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20  .  Select *pX;. 
228c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
228d0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
228e0 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69  item *a;.  SrcLi
228f0 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50  st *pNewSrc;.  P
22900 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
22910 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20  Token dummy;..  
22920 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
22930 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
22940 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d  ntinue;.  if( p-
22950 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72  >pOrderBy==0 ) r
22960 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22970 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20  ue;.  for(pX=p; 
22980 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54  pX && (pX->op==T
22990 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d  K_ALL || pX->op=
229a0 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d  =TK_SELECT); pX=
229b0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20  pX->pPrior){}.  
229c0 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75  if( pX==0 ) retu
229d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
229e0 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72  .  a = p->pOrder
229f0 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70  By->a;.  for(i=p
22a00 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
22a10 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  r-1; i>=0; i--){
22a20 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45  .    if( a[i].pE
22a30 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
22a40 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b  Collate ) break;
22a50 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29  .  }.  if( i<0 )
22a60 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22a70 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  inue;..  /* If w
22a80 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
22a90 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  nt, that means t
22aa0 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
22ab0 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  n is required. *
22ac0 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
22ad0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
22ae0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
22af0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
22b00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
22b10 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
22b20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
22b30 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
22b40 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26  bort;.  memset(&
22b50 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66  dummy, 0, sizeof
22b60 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77  (dummy));.  pNew
22b70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
22b80 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
22b90 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  rm(pParse,0,0,0,
22ba0 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29  &dummy,pNew,0,0)
22bb0 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d  ;.  if( pNewSrc=
22bc0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22bd0 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d  Abort;.  *pNew =
22be0 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d   *p;.  p->pSrc =
22bf0 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70   pNewSrc;.  p->p
22c00 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
22c10 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
22c20 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
22c30 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c  Expr(db, TK_ALL,
22c40 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20   0));.  p->op = 
22c50 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e  TK_SELECT;.  p->
22c60 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e  pWhere = 0;.  pN
22c70 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30  ew->pGroupBy = 0
22c80 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
22c90 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  g = 0;.  pNew->p
22ca0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70  OrderBy = 0;.  p
22cb0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22cc0 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  p->pNext = 0;.  
22cd0 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  p->pWith = 0;.  
22ce0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
22cf0 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61  SF_Compound;.  a
22d00 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
22d10 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74  ags & SF_Convert
22d20 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  ed)==0 );.  p->s
22d30 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
22d40 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72  nverted;.  asser
22d50 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21  t( pNew->pPrior!
22d60 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  =0 );.  pNew->pP
22d70 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22d80 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ew;.  pNew->pLim
22d90 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
22da0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72  pOffset = 0;.  r
22db0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22dc0 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ue;.}..#ifndef S
22dd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
22de0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
22df0 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
22e00 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
22e10 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
22e20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
22e30 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
22e40 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
22e50 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
22e60 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
22e70 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
22e80 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
22e90 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
22ea0 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
22eb0 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
22ec0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
22ed0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
22ee0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
22ef0 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
22f00 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
22f10 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
22f20 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
22f30 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
22f40 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
22f50 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
22f60 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
22f70 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
22f80 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
22f90 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
22fa0 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
22fb0 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fd0 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f   Current outermo
22fe0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
22ff0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
23000 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
23010 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23020 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
23030 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
23040 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
23050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23060 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
23070 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
23080 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
23090 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
230a0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
230b0 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
230c0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
230d0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
230e0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
230f0 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
23100 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
23110 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
23120 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
23130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23140 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
23150 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
23160 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
23170 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
23180 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
23190 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
231a0 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
231b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
231c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
231d0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
231e0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
231f0 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
23200 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
23210 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
23220 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
23230 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
23240 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
23250 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23260 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
23270 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
23280 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23290 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
232a0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
232b0 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
232c0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
232d0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
232e0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
232f0 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
23300 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
23310 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
23320 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
23330 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
23340 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
23350 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
23360 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
23370 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
23380 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
23390 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
233a0 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
233b0 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
233c0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
233d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
233e0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
233f0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
23400 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
23410 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
23420 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57 69  0 || pParse->pWi
23430 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  th==0 );.  if( p
23440 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69 74  With ){.    pWit
23450 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
23460 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
23470 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
23480 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23490 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62 46  ->bFreeWith = bF
234a0 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ree;.  }.}../*.*
234b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
234c0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
234d0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
234e0 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
234f0 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
23500 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
23510 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
23520 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
23530 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
23540 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
23550 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
23560 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
23570 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
23580 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
23590 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
235a0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
235b0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
235c0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
235d0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
235e0 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
235f0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23600 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
23610 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
23620 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
23630 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
23640 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
23650 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
23660 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
23670 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
23680 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
23690 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
236a0 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
236b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
236c0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
236d0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
236e0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
236f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23700 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
23710 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
23720 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
23730 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
23740 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
23750 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
23760 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
23770 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
23780 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23790 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
237a0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
237b0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
237c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
237d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
237e0 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
237f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23800 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
23810 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
23820 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
23830 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23840 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
23850 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
23860 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
23870 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23880 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
23890 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
238a0 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
238b0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
238c0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
238d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
238e0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
238f0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
23900 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
23910 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
23920 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
23930 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
23940 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
23950 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
23960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23970 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
23980 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
23990 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
239a0 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
239b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
239c0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
239d0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
239e0 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
239f0 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  CteErr is non-NU
23a00 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
23a10 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
23a20 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
23a30 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23a40 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
23a50 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
23a60 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23a70 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
23a80 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74  ly. If pCte->zCt
23a90 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  eErr is NULL, th
23aa0 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
23ab0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23ac0 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
23ad0 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
23ae0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
23af0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b  pCte->zCteErr ){
23b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23b10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
23b20 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43  Cte->zCteErr, pC
23b30 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23b50 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
23b60 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23b70 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
23b80 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23b90 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
23ba0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23bb0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
23bc0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
23bd0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23be0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  .    pTab->nRef 
23bf0 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
23c00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
23c10 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
23c20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
23c30 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
23c40 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
23c50 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
23c60 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
23c70 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
23c80 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
23c90 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
23ca0 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
23cb0 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
23cc0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
23cd0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
23ce0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
23cf0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
23d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23d10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23d20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72  NOMEM;.    asser
23d30 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
23d40 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
23d50 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
23d60 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
23d70 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
23d80 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
23d90 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
23da0 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
23db0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
23dc0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
23dd0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
23de0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
23df0 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
23e00 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
23e10 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
23e20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23e30 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
23e40 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
23e50 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23e60 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
23e70 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
23e80 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
23e90 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
23ea0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
23eb0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
23ec0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
23ed0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
23ee0 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
23ef0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23f00 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
23f10 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
23f20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pItem->fg.isRecu
23f30 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
23f40 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
23f50 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
23f60 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
23f70 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
23f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23f90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
23fa0 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
23fb0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
23fc0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
23fd0 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32  if( pTab->nRef>2
23fe0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23ff0 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
24000 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
24010 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
24020 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
24030 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
24040 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
24050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24060 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
24070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
24080 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28  b->nRef==1 || ((
24090 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
240a0 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
240b0 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29  pTab->nRef==2 ))
240c0 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74  ;..    pCte->zCt
240d0 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  eErr = "circular
240e0 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
240f0 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
24100 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
24110 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24120 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
24130 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
24140 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
24150 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
24160 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
24170 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
24180 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
24190 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
241a0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
241b0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
241c0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
241d0 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
241e0 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
241f0 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
24200 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
24210 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
24220 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24230 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
24240 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
24250 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
24260 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
24270 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
24280 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
24290 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
242a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
242b0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
242c0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
242d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
242e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
242f0 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
24300 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
24310 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
24320 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
24330 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
24340 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
24350 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
24360 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
24370 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
24380 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
24390 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
243a0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
243b0 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
243c0 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
243d0 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
243e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
243f0 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
24400 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
24410 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
24420 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
24430 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24440 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
24450 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
24460 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
24470 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
24480 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
24490 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
244a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
244b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
244c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
244d0 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
244e0 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
244f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24500 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
24510 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
24520 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
24530 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
24540 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
24550 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
24560 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24570 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
24580 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
24590 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
245a0 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
245b0 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
245c0 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
245d0 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
245e0 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
245f0 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
24600 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
24610 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
24620 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
24630 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24640 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
24650 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
24660 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
24670 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
24680 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
24690 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70  ->pWith;.  if( p
246a0 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61  With!=0 ){.    a
246b0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
246c0 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
246d0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
246e0 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
246f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  ;.  }.}.#else.#d
24700 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
24710 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
24720 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24730 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
24740 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
24750 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
24760 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
24770 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
24780 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
24790 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
247a0 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
247b0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
247c0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
247d0 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
247e0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
247f0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
24800 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
24810 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
24820 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
24830 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
24840 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
24850 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
24860 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
24870 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
24880 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24890 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
248a0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
248b0 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
248c0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
248d0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
248e0 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
248f0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
24900 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
24910 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
24920 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
24930 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
24940 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
24950 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
24960 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
24970 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
24980 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
24990 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
249a0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65  he persistent re
249b0 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
249c0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
249d0 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
249e0 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
249f0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
24a00 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20   to accommodate 
24a10 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
24a20 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
24a30 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
24a40 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
24a50 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
24a60 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
24a70 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
24a80 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
24a90 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
24aa0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
24ab0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
24ac0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
24ad0 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
24ae0 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
24af0 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
24b00 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
24b10 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
24b20 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
24b30 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
24b40 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
24b50 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
24b60 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
24b70 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
24b80 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
24b90 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
24ba0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
24bb0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
24bc0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
24bd0 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
24be0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
24bf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
24c00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
24c10 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
24c20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24c30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
24c40 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20  r *pE, *pRight, 
24c50 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65  *pExpr;.  u16 se
24c60 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
24c70 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46  lags;..  p->selF
24c80 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
24c90 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
24ca0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
24cb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
24cc0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  bort;.  }.  if( 
24cd0 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30  NEVER(p->pSrc==0
24ce0 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26  ) || (selFlags &
24cf0 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
24d00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
24d10 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
24d20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
24d30 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
24d40 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
24d50 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74  pWalker->xSelect
24d60 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63  Callback2==selec
24d70 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20 20  tPopWith ){.    
24d80 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
24d90 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68  pParse, findRigh
24da0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c  tmost(p)->pWith,
24db0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
24dc0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
24dd0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
24de0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
24df0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
24e00 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
24e10 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
24e20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
24e30 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
24e40 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
24e50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
24e60 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
24e70 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
24e80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
24e90 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
24ea0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
24eb0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
24ec0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
24ed0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
24ee0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
24ef0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
24f00 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
24f10 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
24f20 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
24f30 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
24f40 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
24f50 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
24f60 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
24f70 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
24f80 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
24f90 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
24fa0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
24fb0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
24fc0 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  b );.    if( pFr
24fd0 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
24fe0 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
24ff0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
25000 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
25010 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
25020 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
25030 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
25040 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
25050 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
25060 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
25070 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23  ssert( i==0 );.#
25080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25090 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c  IT_CTE.      sel
250a0 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b  ectPopWith(pWalk
250b0 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20  er, p);.#endif. 
250c0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
250d0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Prune;.    }.#if
250e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
250f0 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
25100 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
25110 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
25120 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25130 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
25140 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
25150 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25160 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
25170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25180 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
25190 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
251a0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
251b0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
251c0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
251d0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
251e0 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
251f0 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
25200 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25210 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
25220 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
25230 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25240 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
25250 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25260 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25270 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
25280 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
25290 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
252a0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
252b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
252c0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
252d0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
252e0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
252f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
25300 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
25310 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
25320 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
25330 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
25340 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
25350 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  r; }.      sqlit
25360 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
25370 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
25380 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62  el->pEList,&pTab
25390 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43  ->nCol,&pTab->aC
253a0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
253b0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
253c0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
253d0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
253e0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
253f0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
25400 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
25410 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
25420 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
25430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25440 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
25450 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
25460 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
25470 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
25480 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25490 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
254a0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
254b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
254c0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
254d0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
254e0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
254f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25500 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
25510 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
25520 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25530 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25540 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
25550 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
25560 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
25570 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
25580 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
25590 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
255a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
255b0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
255c0 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
255d0 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
255e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
255f0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
25600 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
25610 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
25620 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
25630 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
25640 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
25650 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
25660 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
25670 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
25680 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
25690 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
256a0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
256b0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
256c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
256d0 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
256e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
256f0 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
25700 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
25710 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
25720 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
25730 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
25740 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
25750 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70  SetName(pFrom->p
25760 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e  Select, pTab->zN
25770 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
25780 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25790 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
257a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
257b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
257c0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
257d0 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
257e0 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
257f0 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
25800 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
25810 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
25820 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
25830 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
25840 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
25860 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
25870 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
25880 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
25890 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
258a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
258b0 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
258c0 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
258d0 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
258e0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
258f0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
25900 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
25910 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
25920 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
25930 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
25940 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
25950 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
25960 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
25970 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
25980 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
25990 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
259a0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
259b0 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
259c0 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
259d0 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
259e0 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
259f0 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
25a00 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
25a10 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
25a20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
25a30 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
25a40 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
25a50 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
25a60 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
25a70 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
25a80 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25a90 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
25aa0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
25ab0 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
25ac0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
25ad0 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
25ae0 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
25af0 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
25b00 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
25b10 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25b20 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
25b30 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
25b40 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
25b50 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
25b60 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
25b70 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
25b80 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
25b90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25ba0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
25bb0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
25bc0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
25bd0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
25be0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
25bf0 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
25c00 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
25c10 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
25c20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
25c30 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
25c40 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
25c50 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
25c60 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
25c70 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
25c80 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
25c90 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
25ca0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
25cb0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
25cc0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
25cd0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
25ce0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
25cf0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
25d00 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
25d10 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25d20 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
25d30 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
25d40 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
25d50 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
25d60 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
25d70 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
25d80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
25d90 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
25dc0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
25dd0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
25de0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
25df0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
25e00 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
25e10 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
25e20 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
25e30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25e40 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
25e50 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
25e60 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
25e70 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
25e80 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
25e90 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
25ea0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
25eb0 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
25ec0 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
25ed0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
25ee0 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
25ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
25f00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
25f10 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
25f20 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
25f30 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
25f40 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
25f50 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
25f60 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
25f70 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
25f80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
25f90 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
25fa0 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
25fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
25fc0 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
25fd0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
25fe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
25ff0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
26000 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
26010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26020 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
26030 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
26040 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
26050 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
26060 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
26070 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
26080 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
26090 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
260a0 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
260b0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
260c0 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
260d0 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
260e0 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
260f0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
26100 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
26110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
26120 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
26130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26140 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26150 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
26160 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
26170 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
26180 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
26190 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
261a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
261b0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
261c0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
261d0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
261e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
261f0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
26200 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
26210 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
26220 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26230 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
26240 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
26250 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
26260 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26270 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
26280 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
26290 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
262a0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
262b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
262c0 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
262d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
262e0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
262f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26300 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
26310 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
26320 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
26330 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
26340 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
26350 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
26360 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26370 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
26380 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
26390 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
263a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
263b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
263c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
263d0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
263e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
263f0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
26400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
26410 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
26420 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
26430 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
26440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26450 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
26460 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
26470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
26480 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
26490 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
264a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
264b0 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
264c0 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
264d0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
264e0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
264f0 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
26500 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
26510 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
26520 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
26530 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
26540 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
26550 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
26560 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
26570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
26580 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
26590 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
265a0 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
265b0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
265c0 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
265d0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
265e0 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
265f0 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
26600 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26610 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26620 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
26630 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
26640 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
26650 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
26660 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
26670 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
26680 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
26690 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
266a0 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
266b0 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
266c0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
266d0 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
266e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
266f0 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
26700 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
26710 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
26720 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
26730 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
26740 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
26750 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26770 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
26780 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
26790 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
267a0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
267b0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
267c0 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom->fg.jointype
267d0 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
267e0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
267f0 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
26800 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
26810 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
26820 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
26830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26840 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
26850 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
26860 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
26870 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
26880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
26890 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
268a0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
268c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
268d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
268e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
268f0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
26900 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
26910 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
26920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
26930 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
26940 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
26950 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26970 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
26980 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
26990 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
269c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
269d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
269e0 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
269f0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
26a00 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
26a10 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
26a20 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
26a30 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
26a40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
26a50 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
26a60 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
26a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26a80 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26aa0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26ab0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
26ac0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26ad0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
26ae0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
26af0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
26b00 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
26b10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
26b20 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
26b40 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
26b50 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
26b60 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
26b70 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26b80 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
26b90 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
26ba0 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29  pLeft, pExpr, 0)
26bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26bc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
26bd0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
26be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26bf0 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
26c00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
26c10 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
26c20 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
26c30 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
26c40 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
26c50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26c60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26c80 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
26c90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26ca0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
26cb0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
26cc0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
26cd0 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
26ce0 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
26cf0 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
26d00 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
26d10 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
26d20 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
26d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26d40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
26d50 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
26d60 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
26d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
26d80 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
26d90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
26da0 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
26dc0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
26dd0 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
26de0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
26df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26e00 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
26e10 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
26e20 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
26e30 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
26e40 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
26e50 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
26e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26e70 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
26e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26ea0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
26eb0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26ec0 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
26f00 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
26f10 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
26f30 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
26f40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
26f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26f60 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
26f70 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
26f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26f90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26fa0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
26fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26fd0 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
26fe0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
26ff0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
27000 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27010 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
27020 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
27030 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
27040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27050 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
27060 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
27070 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
27080 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
27090 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
270a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
270b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
270c0 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
270d0 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
270e0 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
270f0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
27100 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
27110 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
27120 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
27130 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
27140 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
27150 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27160 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
27170 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
27180 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
27190 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
271a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
271b0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
271c0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
271d0 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
271e0 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
271f0 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
27200 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
27210 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
27220 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
27230 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
27240 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
27250 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
27260 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
27270 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
27280 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
27290 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
272a0 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
272b0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
272c0 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
272d0 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
272e0 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
272f0 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
27300 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
27310 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
27320 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
27330 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
27340 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
27350 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
27360 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
27370 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
27380 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
27390 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
273a0 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
273b0 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
273c0 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
273d0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
273e0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
273f0 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
27400 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
27410 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
27420 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
27430 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
27440 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
27450 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
27460 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
27470 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
27480 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
27490 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
274a0 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
274b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
274c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
274d0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
274e0 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
274f0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
27500 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
27510 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
27520 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
27530 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
27540 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
27550 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
27560 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
27570 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
27580 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
27590 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
275a0 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
275b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
275c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
275d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
275e0 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
275f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
27600 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
27610 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
27620 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
27630 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
27640 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
27650 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
27660 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rse;.  if( pPars
27670 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29  e->hasCompound )
27680 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
27690 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
276a0 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
276b0 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73  oSubquery;.    s
276c0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
276d0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (&w, pSelect);. 
276e0 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61   }.  w.xSelectCa
276f0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
27700 78 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28  xpander;.  if( (
27710 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
27720 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
27730 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78  e)==0 ){.    w.x
27740 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
27750 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
27760 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61  .  }.  sqlite3Wa
27770 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27780 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
27790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
277a0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
277b0 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
277c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
277d0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
277e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
277f0 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
27800 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
27810 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
27820 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
27830 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
27840 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
27850 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
27860 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
27870 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
27880 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
27890 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
278a0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
278b0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
278c0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
278d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
278e0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
278f0 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
27900 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
27910 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
27920 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
27930 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
27940 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
27950 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
27960 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
27970 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
27980 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
27990 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
279a0 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
279b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
279c0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
279d0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
279e0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
279f0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
27a00 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
27a10 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
27a20 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
27a30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
27a40 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
27a50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27a60 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
27a70 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
27a80 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
27a90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
27aa0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
27ab0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
27ac0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
27ad0 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
27ae0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
27af0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
27b00 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
27b10 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
27b20 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
27b30 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
27b40 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
27b50 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
27b60 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
27b70 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
27b80 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
27b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
27ba0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
27bb0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27bc0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
27bd0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
27be0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
27bf0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66  lect;.        if
27c00 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
27c10 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
27c20 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
27c30 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
27c40 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41           selectA
27c50 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
27c60 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
27c70 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
27c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27c90 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
27ca0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
27cb0 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
27cc0 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
27cd0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
27ce0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
27cf0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
27d00 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
27d10 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
27d20 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
27d30 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
27d40 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
27d50 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
27d60 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27d70 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
27d80 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
27d90 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
27da0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
27db0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
27dc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27dd0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
27de0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27df0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
27e00 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
27e10 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
27e20 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
27e30 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
27e40 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
27e50 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
27e60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
27e70 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
27e80 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
27e90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27ea0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
27eb0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
27ec0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
27ed0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
27ee0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
27ef0 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
27f00 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
27f10 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
27f20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
27f30 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
27f40 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
27f50 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
27f60 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
27f70 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
27f80 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
27f90 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
27fa0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
27fb0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
27fc0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
27fd0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
27fe0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
27ff0 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
28000 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
28010 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
28020 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
28030 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
28040 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
28050 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
28060 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
28070 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
28080 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
28090 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
280a0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
280b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
280c0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
280d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
280e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
280f0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
28100 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
28110 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
28120 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
28130 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
28140 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
28150 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
28160 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
28170 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
28180 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
28190 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
281a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
281b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
281c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
281d0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
281e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
281f0 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
28200 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
28210 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
28220 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
28230 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
28240 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
28250 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
28260 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
28270 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
28280 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28290 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
282a0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
282b0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
282c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
282d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
282e0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
282f0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
28300 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
28310 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
28320 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
28330 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
28340 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
28350 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
28360 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
28370 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
28380 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
28390 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
283a0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
283b0 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
283c0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
283d0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
283e0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
283f0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
28400 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28410 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
28420 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
28430 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
28440 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
28450 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
28460 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
28470 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
28480 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
28490 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
284a0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
284b0 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
284c0 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
284d0 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
284e0 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
284f0 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
28500 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
28510 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
28520 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
28530 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
28540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
28550 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
28560 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
28570 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
28580 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
28590 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
285a0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
285b0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
285c0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
285d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
285e0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
285f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
28600 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
28610 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
28620 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
28630 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
28640 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
28650 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
28660 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
28670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28680 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
28690 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
286a0 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
286b0 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
286c0 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
286d0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
286e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
286f0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
28700 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
28710 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
28720 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
28730 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
28740 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
28750 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
28760 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
28770 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
28780 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
28790 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
287a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
287b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
287c0 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
287d0 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
287e0 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
287f0 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
28800 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
28810 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
28820 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
28830 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
28840 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
28850 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
28860 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
28870 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
28880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28890 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
288a0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
288b0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
288c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
288e0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
288f0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
28900 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
28910 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
28920 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
28930 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
28940 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
28950 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
28960 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
28970 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
28980 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
28990 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
289a0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
289b0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
289c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
289d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
289e0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
289f0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
28a00 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
28a10 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
28a20 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
28a30 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
28a40 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
28a50 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
28a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
28a70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
28a80 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
28a90 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
28aa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28ab0 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
28ac0 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
28ad0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
28ae0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
28b00 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
28b10 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
28b20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
28b30 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
28b40 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
28b50 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
28b60 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
28b70 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
28b80 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
28b90 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
28ba0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
28bb0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
28bc0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
28bd0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
28be0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
28bf0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
28c00 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
28c10 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
28c20 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
28c30 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
28c40 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
28c50 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
28c60 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
28c70 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
28c80 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
28c90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
28ca0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
28cb0 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
28cc0 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
28cd0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
28ce0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
28cf0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
28d00 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
28d10 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
28d20 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
28d30 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28d40 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
28d50 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
28d60 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
28d70 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
28d80 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
28d90 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
28da0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
28db0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
28dc0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
28dd0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
28de0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
28df0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
28e00 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
28e10 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
28e20 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
28e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
28e40 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
28e50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
28e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28e70 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
28e80 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
28e90 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
28ea0 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
28eb0 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
28ec0 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
28ed0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
28ee0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
28ef0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
28f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28f10 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
28f20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
28f30 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
28f40 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
28f50 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
28f60 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
28f70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
28f80 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
28f90 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
28fa0 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
28fb0 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
28fc0 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
28fd0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
28fe0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
28ff0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
29000 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
29010 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
29020 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
29030 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
29040 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
29050 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
29060 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
29070 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
29080 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
29090 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
290a0 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
290b0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
290c0 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
290d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
290e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
290f0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
29100 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
29110 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
29120 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
29130 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
29140 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
29150 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
29160 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
29190 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
291a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
291b0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
291c0 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
291d0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
291e0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
291f0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
29200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
29210 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
29220 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
29230 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
29240 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
29250 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
29260 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
29270 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
29280 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29290 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
292a0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
292b0 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
292c0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
292d0 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
292e0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
292f0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
29300 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
29310 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
29320 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
29330 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
29340 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
29350 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
29360 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
29370 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
29380 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
29390 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
293a0 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
293b0 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
293c0 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
293d0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
293e0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
293f0 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
29400 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
29410 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
29420 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
29430 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
29440 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
29450 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
29460 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
29470 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
29480 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
29490 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
294a0 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
294b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
294c0 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
294d0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
294e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
294f0 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
29500 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
29510 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
29520 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
29530 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
29540 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
29550 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
29560 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
29570 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
29580 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
29590 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
295a0 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
295b0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
295c0 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
295d0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
295e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
295f0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
29600 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
29610 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
29620 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
29630 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
29640 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
29650 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
29660 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
29670 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
29680 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
29690 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
296a0 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
296b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
296c0 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
296d0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
296e0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
296f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
29700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
29710 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
29720 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
29750 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
29760 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
29770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29780 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
29790 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
297a0 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
297b0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
297c0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
297d0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
297e0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
297f0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
29800 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
29810 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  ;.    char *zEqp
29820 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
29830 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
29840 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
29850 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
29860 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
29870 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
29880 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
29890 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
298a0 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
298b0 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
298c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
298d0 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
298e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
298f0 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
29900 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
29910 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
29920 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
29930 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
29940 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
29950 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
29960 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
29970 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
29980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29990 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
299a0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
299b0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
299c0 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
299d0 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
299e0 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
299f0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
29a00 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
29a10 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
29a20 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
29a30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29a40 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
29a50 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
29a60 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
29a70 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
29a80 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
29a90 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
29aa0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
29ab0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
29ac0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29ad0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
29ae0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
29af0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
29b00 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
29b10 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
29b20 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
29b30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
29b40 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
29b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29b60 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
29b70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
29b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29b90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
29ba0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
29bb0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
29bc0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
29bd0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
29be0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
29bf0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
29c00 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
29c10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
29c20 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
29c30 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
29c40 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
29c50 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
29c60 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
29c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29c80 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
29c90 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
29ca0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
29cb0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
29cc0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
29cd0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
29ce0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
29cf0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
29d00 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
29d10 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
29d20 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
29d30 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
29d40 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
29d50 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
29d60 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
29d70 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
29d80 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
29d90 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
29da0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
29db0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
29dc0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
29dd0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29de0 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
29df0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
29e00 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
29e10 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
29e20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
29e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29e40 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
29e50 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
29e60 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
29e70 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
29e80 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
29e90 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
29ea0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
29eb0 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
29ec0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
29ed0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
29ee0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
29ef0 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
29f00 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
29f10 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
29f20 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
29f30 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
29f40 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
29f50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
29f60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
29f70 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
29f80 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
29f90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
29fa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
29fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29fc0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
29fd0 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
29fe0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
29ff0 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
2a000 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
2a010 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2a020 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
2a030 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2a040 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
2a050 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2a060 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
2a070 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2a080 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
2a090 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2a0a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
2a0b0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
2a0c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
2a0d0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
2a0e0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
2a0f0 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
2a100 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50  ACE_ENABLED.  pP
2a110 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
2a120 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54  ent++;.  SELECTT
2a130 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2a140 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
2a150 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28  ing:\n"));.  if(
2a160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2a170 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2a180 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2a190 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2a1a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2a1b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a1c0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a1d0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
2a1e0 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
2a1f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
2a200 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
2a210 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
2a220 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a230 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a240 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
2a250 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
2a260 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2a270 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2a280 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
2a290 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
2a2a0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2a2b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
2a2c0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2a2d0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
2a2e0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
2a2f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
2a300 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a310 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
2a320 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
2a330 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
2a340 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2a350 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
2a360 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a370 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
2a380 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2a390 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
2a3a0 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
2a3b0 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
2a3c0 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
2a3d0 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
2a3e0 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
2a3f0 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
2a400 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
2a410 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
2a420 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
2a430 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2a440 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2a450 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
2a460 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
2a470 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
2a480 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
2a490 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
2a4a0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
2a4b0 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
2a4c0 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
2a4d0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
2a4e0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
2a4f0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
2a500 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2a510 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50  ->pSrc;.  if( pP
2a520 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
2a530 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2a540 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
2a550 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73  t_end;.  }.  ass
2a560 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
2a570 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  0 );.  isAgg = (
2a580 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2a590 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
2a5a0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2a5b0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2a5c0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2a5d0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
2a5e0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2a5f0 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  0,pParse,p, ("af
2a600 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
2a610 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ion:\n"));.    s
2a620 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2a630 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2a640 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a   }.#endif...  /*
2a650 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
2a660 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
2a670 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
2a680 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
2a690 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
2a6a0 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
2a6b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2a6c0 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
2a6d0 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
2a6e0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
2a6f0 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70 45 4c 69  , pDest, p->pELi
2a700 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
2a710 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2a720 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
2a730 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74   /* Try to flatt
2a740 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
2a750 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a760 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
2a770 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
2a780 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2a790 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2a7a0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2a7b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2a7c0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
2a7d0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
2a7e0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2a7f0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2a800 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2a810 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2a820 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2a830 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2a840 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67  ct;.    int isAg
2a850 67 53 75 62 3b 0a 20 20 20 20 69 66 28 20 70 53  gSub;.    if( pS
2a860 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2a870 3b 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ;.    isAggSub =
2a880 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2a890 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2a8a0 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
2a8b0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2a8c0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2a8d0 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
2a8e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
2a8f0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
2a900 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
2a910 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2a920 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
2a930 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
2a940 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
2a950 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2a960 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
2a970 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2a980 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2a990 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2a9a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2a9b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2a9c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2a9d0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2a9e0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2a9f0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2aa00 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2aa10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2aa20 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ..  /* Get a poi
2aa30 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e  nter the VDBE un
2aa40 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2aa50 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  , allocating a n
2aa60 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20  ew VDBE if one. 
2aa70 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   ** does not alr
2aa80 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  eady exist */.  
2aa90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2aaa0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
2aab0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
2aac0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64  lect_end;..#ifnd
2aad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2aae0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
2aaf0 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
2ab00 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
2ab10 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
2ab20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
2ab30 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
2ab40 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
2ab50 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2ab60 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2ab70 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2ab80 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2ab90 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2aba0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2abb0 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2abc0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2abd0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2abe0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2abf0 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2ac00 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2ac10 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2ac20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2ac30 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2ac40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ac50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2ac60 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2ac70 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
2ac80 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2ac90 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
2aca0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2acb0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2acc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2acd0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2ace0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
2acf0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2ad00 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2ad10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2ad20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2ad30 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
2ad40 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
2ad50 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2ad60 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2ad70 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2ad80 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
2ad90 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
2ada0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
2adb0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2adc0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
2add0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
2ade0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
2adf0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2ae00 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
2ae10 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
2ae20 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
2ae30 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
2ae40 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
2ae50 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
2ae60 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
2ae70 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
2ae80 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
2ae90 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
2aea0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
2aeb0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
2aec0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
2aed0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
2aee0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
2aef0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
2af00 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
2af10 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2af20 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
2af30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2af40 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  fg.viaCoroutine=
2af50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2af60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2af70 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2af80 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2af90 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2afa0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2afb0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2afc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2afd0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2afe0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2aff0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2b000 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2b010 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2b020 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2b030 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2b040 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2b050 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2b060 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2b070 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2b080 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2b090 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2b0a0 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2b0b0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2b0c0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2b0d0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2b0e0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2b0f0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2b100 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2b110 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2b120 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2b130 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2b140 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2b150 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2b160 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2b170 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2b180 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2b190 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2b1a0 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2b1b0 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2b1c0 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2b1d0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2b1e0 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2b1f0 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2b200 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2b210 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2b220 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2b230 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2b240 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e  ms(db, pSub, p->
2b250 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2b260 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2b270 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2b280 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2b290 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2b2a0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2b2b0 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2b2c0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2b2d0 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2b2e0 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2b2f0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2b300 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2b310 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2b320 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2b330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2b340 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2b350 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2b360 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uery.    */.    
2b370 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2b380 72 63 3d 3d 31 0a 20 20 20 20 20 26 26 20 28 70  rc==1.     && (p
2b390 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b3a0 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  All)==0.     && 
2b3b0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2b3c0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2b3d0 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20  ubqCoroutine).  
2b3e0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2b3f0 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2b400 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2b410 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2b420 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2b430 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2b440 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2b450 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b460 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2b470 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2b480 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2b490 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2b4a0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2b4b0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2b4c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b4d0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
2b4e0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2b4f0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
2b500 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2b510 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
2b520 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2b530 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2b540 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
2b550 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
2b560 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2b570 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
2b580 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2b590 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2b5a0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2b5b0 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2b5c0 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2b5d0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2b5e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2b5f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2b600 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2b610 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2b620 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2b630 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2b640 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2b650 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61     pItem->fg.via
2b660 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
2b670 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b680 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
2b690 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
2b6a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b6b0 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
2b6c0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b6d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b6e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2b6f0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
2b700 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2b710 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2b720 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2b730 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2b740 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2b750 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
2b760 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2b770 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
2b780 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
2b790 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
2b7a0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2b7b0 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
2b7c0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
2b7d0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
2b7e0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
2b7f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2b800 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
2b810 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2b820 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2b830 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2b840 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2b850 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
2b860 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
2b870 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
2b880 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
2b890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2b8a0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2b8b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2b8c0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2b8d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2b8e0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2b8f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b900 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2b910 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2b920 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2b930 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2b940 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2b950 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2b960 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2b970 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2b980 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2b990 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2b9a0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2b9b0 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2b9c0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2b9d0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2b9e0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2b9f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2ba00 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2ba10 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2ba20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2ba30 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
2ba40 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
2ba50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2ba60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ba70 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2ba80 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2ba90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2baa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bab0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2bac0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2bad0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2bae0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2baf0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2bb00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2bb10 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2bb20 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2bb30 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2bb40 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2bb50 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2bb60 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2bb70 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2bb80 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2bb90 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2bba0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2bbb0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2bbc0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2bbd0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2bbe0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2bbf0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2bc00 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2bc10 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2bc20 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2bc30 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2bc40 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2bc50 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2bc60 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2bc70 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2bc80 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2bc90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2bca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bcb0 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2bcc0 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2bcd0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2bce0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2bcf0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2bd00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2bd10 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2bd20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
2bd30 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
2bd40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2bd50 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a  rHeight(p);.  }.
2bd60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72  #endif..  /* Var
2bd70 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66  ious elements of
2bd80 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69   the SELECT copi
2bd90 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  ed into local va
2bda0 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a  riables for.  **
2bdb0 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a   convenience */.
2bdc0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2bdd0 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d  List;.  pWhere =
2bde0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
2bdf0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2be00 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
2be10 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
2be20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2be30 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2be40 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
2be50 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  0;..#if SELECTTR
2be60 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2be70 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2be80 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2be90 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2bea0 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
2beb0 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d  "After all FROM-
2bec0 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a  clause analysis:
2bed0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2bee0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2bef0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2bf00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2bf10 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2bf20 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2bf30 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2bf40 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2bf50 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2bf60 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2bf70 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2bf80 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2bf90 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2bfa0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2bfb0 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2bfc0 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2bfd0 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2bfe0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2bff0 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2c000 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
2c010 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
2c020 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
2c030 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2c040 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2c050 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
2c060 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2c070 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
2c080 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
2c090 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
2c0a0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
2c0b0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
2c0c0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
2c0d0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
2c0e0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
2c0f0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
2c100 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
2c110 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
2c120 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
2c130 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
2c140 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
2c150 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
2c160 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
2c170 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
2c180 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
2c190 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
2c1a0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2c1b0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2c1c0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
2c1d0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
2c1e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
2c1f0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
2c200 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
2c210 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
2c220 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2c230 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2c240 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2c250 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2c260 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2c270 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
2c280 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
2c290 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
2c2a0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
2c2b0 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
2c2c0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
2c2d0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
2c2e0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
2c2f0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
2c300 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
2c310 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
2c320 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
2c330 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
2c340 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
2c350 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
2c360 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
2c370 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
2c380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c390 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2c3a0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2c3b0 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
2c3c0 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
2c3d0 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
2c3e0 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
2c3f0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
2c400 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2c410 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
2c420 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2c430 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
2c440 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
2c450 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
2c460 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2c470 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
2c480 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
2c490 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
2c4a0 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
2c4b0 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
2c4c0 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
2c4d0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2c4e0 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
2c4f0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
2c500 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
2c510 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2c520 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
2c530 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
2c540 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2c550 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2c560 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2c570 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2c580 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c590 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2c5a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2c5b0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2c5c0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2c5d0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2c5e0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2c5f0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2c600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c610 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2c620 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2c630 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2c640 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2c650 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2c660 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2c670 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2c680 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2c690 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2c6a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2c6b0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c6c0 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2c6d0 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2c6e0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2c6f0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2c700 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2c710 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2c720 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2c730 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2c740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c750 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2c760 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2c770 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2c780 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2c790 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2c7a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2c7b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2c7c0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
2c7d0 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47  SelectRow = LARG
2c7e0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d  EST_INT64;.  com
2c7f0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
2c800 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
2c810 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
2c820 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
2c830 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2c840 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2c850 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
2c860 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2c870 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
2c880 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
2c890 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
2c8a0 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
2c8b0 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
2c8c0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
2c8d0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2c8e0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
2c8f0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
2c900 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2c910 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
2c920 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2c930 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2c940 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
2c950 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
2c960 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2c970 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2c980 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
2c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9a0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2c9b0 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
2c9e0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2c9f0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
2ca00 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
2ca30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ca40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
2ca50 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
2ca60 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2ca70 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2ca80 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2ca90 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
2caa0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2cab0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
2cac0 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
2cad0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
2cae0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
2caf0 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
2cb00 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
2cb10 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
2cb20 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
2cb30 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
2cb40 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
2cb50 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2cb60 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20  INCT : 0);..    
2cb70 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
2cb80 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
2cb90 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2cba0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2cbb0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2cbc0 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f  pWhere, sSort.pO
2cbd0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74         p->pEList
2cc00 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29  , wctrlFlags, 0)
2cc10 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2cc20 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2cc30 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
2cc40 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2cc50 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2cc60 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
2cc70 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
2cc80 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
2cc90 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
2cca0 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
2ccb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
2ccc0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2ccd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2cce0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
2ccf0 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
2cd00 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
2cd10 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2cd20 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
2cd30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
2cd40 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2cd50 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
2cd60 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
2cd70 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2cd80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
2cd90 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
2cda0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2cdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
2cdc0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2cdd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2cde0 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
2cdf0 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
2ce00 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
2ce10 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
2ce20 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
2ce30 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
2ce40 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
2ce50 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
2ce60 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2ce70 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
2ce80 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
2ce90 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
2cea0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2ceb0 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
2cec0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
2ced0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cee0 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
2cef0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
2cf00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2cf10 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
2cf20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
2cf30 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2cf40 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
2cf50 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
2cf60 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
2cf70 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
2cf80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cf90 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
2cfa0 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfc0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
2cfd0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
2cfe0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
2cff0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
2d000 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2d010 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2d020 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
2d030 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
2d040 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
2d050 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
2d060 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
2d070 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
2d080 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
2d090 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
2d0a0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
2d0b0 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
2d0c0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
2d0d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
2d0e0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
2d0f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d100 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2d110 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
2d120 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2d130 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
2d140 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
2d150 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
2d160 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
2d170 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
2d180 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
2d190 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
2d1a0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
2d1b0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
2d1e0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
2d1f0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
2d200 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
2d230 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
2d240 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
2d250 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
2d260 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
2d270 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
2d280 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
2d290 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
2d2a0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
2d2b0 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
2d2c0 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
2d2d0 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
2d2e0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
2d2f0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
2d300 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
2d310 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
2d320 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
2d330 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
2d340 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
2d350 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
2d360 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
2d370 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
2d380 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
2d390 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
2d3a0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
2d3b0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
2d3c0 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
2d3d0 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
2d3e0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
2d3f0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
2d400 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
2d410 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
2d420 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
2d430 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
2d440 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2d450 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
2d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d470 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2d480 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
2d490 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2d4a0 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
2d4b0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
2d4c0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
2d4d0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
2d4e0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
2d4f0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
2d500 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
2d510 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2d520 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2d530 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2d540 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
2d550 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
2d560 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
2d570 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2d580 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d590 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2d5a0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2d5b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
2d5c0 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d  lectRow>100 ) p-
2d5d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30  >nSelectRow = 10
2d5e0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2d5f0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
2d600 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  w = 1;.    }..  
2d610 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2d620 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
2d630 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
2d640 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
2d650 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
2d660 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
2d670 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
2d680 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
2d690 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
2d6a0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
2d6b0 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
2d6c0 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
2d6d0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
2d6e0 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
2d6f0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
2d700 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
2d710 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
2d720 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a   BY might use a.
2d730 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2d740 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65  index that cause
2d750 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f  s rows to be gro
2d760 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73  uped together as
2d770 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
2d780 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
2d790 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72  y sorted. Either
2d7a0 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65   way, record the
2d7b0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20   fact that the. 
2d7c0 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61     ** ORDER BY a
2d7d0 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
2d7e0 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ses are the same
2d7f0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2d800 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a  orderByGrp.    *
2d810 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
2d820 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2d830 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2d840 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70  GroupBy, sSort.p
2d850 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
2d860 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79  ){.      orderBy
2d870 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Grp = 1;.    }. 
2d880 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2d890 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
2d8a0 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
2d8b0 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
2d8c0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
2d8d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2d8e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
2d8f0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
2d900 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
2d910 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
2d920 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
2d930 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
2d940 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
2d950 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
2d960 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
2d970 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
2d980 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d990 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
2d9a0 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
2d9b0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
2d9c0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2d9d0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
2d9e0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2d9f0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
2da00 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
2da10 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
2da20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2da30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
2da40 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
2da50 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
2da60 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
2da70 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
2da80 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2da90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2daa0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2dab0 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
2dac0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2dad0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2dae0 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
2daf0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
2db00 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
2db10 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2db20 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
2db30 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
2db40 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
2db50 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
2db60 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
2db70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2db80 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
2db90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2dba0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2dbb0 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
2dbc0 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
2dbd0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2dbe0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
2dbf0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
2dc00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2dc10 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2dc20 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
2dc30 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
2dc40 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
2dc50 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
2dc60 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
2dc70 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
2dc80 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
2dc90 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
2dca0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2dcb0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2dcc0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
2dcd0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2dce0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
2dcf0 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
2dd00 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
2dd10 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
2dd20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
2dd30 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
2dd40 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
2dd50 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2dd60 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2dd70 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
2dd80 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2dd90 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
2dda0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2ddb0 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
2ddc0 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
2ddd0 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
2dde0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2ddf0 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
2de00 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
2de10 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2de20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
2de30 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
2de40 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
2de50 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2de60 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
2de70 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
2de80 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
2de90 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
2dea0 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
2deb0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
2dec0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
2ded0 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
2dee0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
2def0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2df00 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
2df10 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2df20 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
2df30 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
2df40 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
2df50 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
2df60 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
2df70 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
2df80 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
2df90 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
2dfa0 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2dfb0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
2dfc0 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
2dfd0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
2dfe0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
2dff0 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
2e000 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
2e010 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
2e020 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
2e030 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
2e040 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
2e050 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
2e060 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
2e070 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
2e080 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
2e090 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
2e0a0 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
2e0b0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
2e0c0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2e0d0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
2e0e0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
2e0f0 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
2e100 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2e110 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2e120 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2e130 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2e140 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
2e150 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
2e160 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
2e170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2e180 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
2e190 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
2e1a0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2e1b0 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
2e1c0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
2e1d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
2e1e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2e1f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
2e200 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e210 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
2e220 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
2e230 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
2e240 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
2e250 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
2e260 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e270 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
2e280 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2e290 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
2e2a0 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
2e2b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2e2c0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2e2d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2e2e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
2e2f0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
2e300 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2e310 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
2e320 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2e330 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
2e340 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
2e350 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
2e360 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
2e370 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2e380 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
2e390 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2e3a0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2e3b0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e3d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e3e0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
2e3f0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2e400 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2e410 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
2e420 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2e430 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e440 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2e450 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
2e460 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e470 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
2e480 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
2e490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e4a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2e4b0 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
2e4c0 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
2e4d0 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
2e4e0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
2e4f0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
2e500 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
2e510 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2e520 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
2e530 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
2e540 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
2e550 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
2e560 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
2e570 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
2e580 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
2e590 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
2e5a0 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
2e5b0 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
2e5c0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
2e5d0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
2e5e0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
2e5f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e600 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e610 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
2e620 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
2e630 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2e640 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2e650 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2e660 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
2e670 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
2e680 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
2e690 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
2e6a0 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
2e6b0 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
2e6c0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2e6d0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2e6e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
2e6f0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
2e700 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
2e710 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
2e720 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2e730 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
2e740 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
2e750 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
2e760 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
2e770 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
2e780 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
2e790 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2e7a0 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
2e7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
2e7c0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
2e7d0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
2e7e0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
2e7f0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
2e800 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2e810 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
2e820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2e830 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
2e840 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
2e850 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
2e860 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
2e870 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
2e880 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
2e890 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
2e8a0 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
2e8b0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2e8c0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
2e8d0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
2e8e0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
2e8f0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
2e900 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
2e910 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
2e920 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
2e930 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
2e940 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
2e950 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
2e960 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
2e970 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
2e980 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2e990 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2e9a0 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
2e9b0 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
2e9c0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
2e9d0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
2e9e0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
2e9f0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
2ea00 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
2ea10 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
2ea20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
2ea30 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2ea40 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
2ea50 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2ea60 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2ea70 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ea80 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2ea90 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2eaa0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
2eab0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
2eac0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
2eae0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2eaf0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2eb00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eb10 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
2eb20 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2eb30 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
2eb40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2eb50 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2eb60 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2eb70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2eb80 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2eb90 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
2eba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2ebb0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
2ebc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2ebd0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2ebe0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2ebf0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2ec00 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
2ec10 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2ec20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ec30 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2ec40 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2ec50 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
2ec60 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
2ec70 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
2ec80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
2ec90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
2eca0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
2ecb0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecd0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2ece0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2ecf0 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
2ed00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2ed10 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ed30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ed40 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
2ed50 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
2ed60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
2ed70 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2ed80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ed90 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
2eda0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2edb0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2edc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2edd0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
2ede0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
2edf0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
2ee00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2ee10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2ee20 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
2ee30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2ee40 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2ee50 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2ee60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2ee70 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
2ee80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2ee90 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2eea0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
2eeb0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2eec0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2eed0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2eee0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2eef0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
2ef00 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
2ef10 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
2ef20 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
2ef30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2ef40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ef50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2ef60 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
2ef70 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
2ef80 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2ef90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2efa0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
2efb0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
2efc0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
2efd0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
2efe0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
2eff0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
2f000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f010 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2f020 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
2f030 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
2f040 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2f050 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
2f060 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2f070 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
2f080 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
2f090 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
2f0a0 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
2f0b0 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
2f0c0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2f0d0 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
2f0e0 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
2f0f0 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
2f100 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
2f110 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
2f120 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
2f130 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
2f140 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
2f150 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
2f160 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2f170 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
2f180 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
2f190 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
2f1a0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
2f1b0 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
2f1c0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2f1d0 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
2f1e0 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
2f1f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
2f200 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
2f210 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
2f220 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
2f230 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2f240 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
2f250 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
2f260 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
2f270 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
2f280 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
2f290 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
2f2a0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
2f2b0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
2f2c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f2d0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2f2e0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2f2f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2f300 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
2f310 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2f320 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
2f330 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
2f340 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
2f350 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
2f360 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
2f370 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
2f380 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
2f390 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
2f3a0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2f3b0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
2f3c0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
2f3d0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
2f3e0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
2f3f0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
2f400 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
2f410 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
2f420 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
2f430 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2f440 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2f450 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f460 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2f470 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
2f480 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2f490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f4a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
2f4b0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
2f4c0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
2f4f0 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
2f500 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2f510 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
2f520 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2f530 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2f540 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2f550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f560 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2f570 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
2f580 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2f590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f5a0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
2f5b0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
2f5c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f5d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
2f5e0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
2f5f0 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
2f600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f610 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f620 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
2f630 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
2f640 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2f650 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2f670 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
2f680 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
2f690 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
2f6a0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
2f6b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f6c0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2f6d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f6e0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
2f6f0 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f  0, j1+1); VdbeCo
2f700 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
2f710 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2f720 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
2f730 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
2f740 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
2f750 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
2f760 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
2f770 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2f780 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
2f790 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
2f7a0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
2f7b0 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
2f7c0 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
2f7d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2f7e0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
2f7f0 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
2f800 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
2f810 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
2f820 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
2f830 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
2f840 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
2f850 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2f860 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
2f870 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2f880 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2f890 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
2f8a0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
2f8b0 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
2f8c0 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
2f8d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f8e0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
2f8f0 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
2f900 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2f910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f920 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f930 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2f940 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2f950 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2f960 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2f970 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
2f980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f990 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2f9a0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
2f9b0 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43   addrEnd); VdbeC
2f9c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2f9d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f9e0 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
2f9f0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2fa00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fa10 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2fa20 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2fa30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2fa40 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
2fa50 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2fa60 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2fa70 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2fa80 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
2fa90 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
2faa0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2fab0 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
2fac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2fad0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2fae0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
2faf0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2fb00 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2fb10 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2fb20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fb30 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
2fb40 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2fb50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fb60 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
2fb70 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2fb80 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
2fb90 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
2fba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
2fbb0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2fbc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fbd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2fbe0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
2fbf0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2fc00 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
2fc10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2fc20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
2fc30 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2fc40 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2fc50 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
2fc60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2fc70 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
2fc80 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
2fc90 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
2fca0 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
2fcb0 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
2fcc0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2fcd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fce0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2fcf0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2fd00 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2fd10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2fd20 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
2fd30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
2fd40 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
2fd50 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
2fd60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd70 41 64 64 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  AddGoto(v, addrE
2fd80 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
2fd90 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2fda0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2fdb0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
2fdc0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2fdd0 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
2fde0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
2fdf0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
2fe00 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
2fe10 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
2fe20 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2fe30 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
2fe40 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
2fe50 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
2fe60 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
2fe70 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
2fe80 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
2fe90 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
2fea0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
2feb0 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
2fec0 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
2fed0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
2fee0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
2fef0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
2ff00 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
2ff10 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
2ff20 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
2ff30 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
2ff40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2ff50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ff60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2ff70 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
2ff80 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2ff90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
2ffa0 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
2ffb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ffc0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ffd0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2ffe0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
2fff0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30000 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
30010 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
30020 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
30030 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30040 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30060 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
30070 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
30080 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
30090 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
300a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
300b0 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20  nt((v, "Groupby 
300c0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
300d0 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
300e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
300f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
30100 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
30110 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  Row);.      fina
30120 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
30130 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
30140 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
30150 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
30160 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
30170 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
30180 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
30190 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
301a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
301b0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
301c0 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20  -1, &sSort,.    
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301e0 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
301f0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
30200 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
30210 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
30220 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
30230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30240 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
30250 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
30260 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30270 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
30280 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
30290 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
302a0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
302b0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
302c0 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
302d0 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
302e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
302f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30300 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
30310 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
30320 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
30330 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30350 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30360 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
30370 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
30380 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
30390 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
303a0 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
303b0 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
303c0 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
303d0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
303e0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
303f0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
30400 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
30410 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
30420 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
30430 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
30440 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
30450 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
30460 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
30470 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
30480 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
30490 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
304a0 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
304b0 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
304c0 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
304d0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
304e0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
304f0 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
30500 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
30510 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
30520 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
30530 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
30540 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
30550 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
30560 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
30570 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
30580 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
30590 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
305a0 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
305b0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
305c0 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
305d0 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
305e0 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
305f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
30600 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
30610 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
30620 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
30630 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
30640 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
30650 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
30660 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
30670 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
30680 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
30690 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
306a0 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
306b0 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
306c0 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
306d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
306e0 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
306f0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
30700 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
30710 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
30720 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
30730 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
30740 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
30750 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
30760 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
30770 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
30780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30790 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
307a0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
307b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
307c0 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
307d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
307e0 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
307f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
30800 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
30810 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30820 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
30830 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
30840 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
30850 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
30860 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
30870 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
30880 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
30890 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
308a0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
308b0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
308c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
308d0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
308e0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
308f0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
30900 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
30910 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
30920 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
30930 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63  he lowest scan c
30940 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ost..        **.
30950 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31          ** (2011
30960 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64  -04-15) Do not d
30970 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66  o a full scan of
30980 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e   an unordered in
30990 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
309a0 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33          ** (2013
309b0 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63  -10-03) Do not c
309c0 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73  ount the entries
309d0 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e   in a partial in
309e0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
309f0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72          ** In pr
30a00 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e  actice the KeyIn
30a10 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  fo structure wil
30a20 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49  l not be used. I
30a30 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20  t is only .     
30a40 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20     ** passed to 
30a50 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64  keep OP_OpenRead
30a60 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20   happy..        
30a70 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
30a80 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
30a90 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33   pBest = sqlite3
30aa0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
30ab0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66  pTab);.        f
30ac0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
30ad0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
30ae0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
30af0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
30b00 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  x->bUnordered==0
30b10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
30b20 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  Idx->szIdxRow<pT
30b30 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20  ab->szTabRow.   
30b40 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
30b50 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d  >pPartIdxWhere==
30b60 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30b70 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d  (!pBest || pIdx-
30b80 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d  >szIdxRow<pBest-
30b90 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20  >szIdxRow).     
30ba0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30bb0 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
30bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30be0 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20  if( pBest ){.   
30bf0 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70         iRoot = p
30c00 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  Best->tnum;.    
30c10 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
30c20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
30c30 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
30c40 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Best);.        }
30c50 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
30c60 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
30c70 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68  rsor, execute th
30c80 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73  e OP_Count, clos
30c90 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f  e the cursor. */
30ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30cb0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
30cc0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
30cd0 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20  sr, iRoot, iDb, 
30ce0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
30cf0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
30d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30d10 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
30d20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
30d30 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
30d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30d60 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
30d70 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e   iCsr, sAggInfo.
30d80 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a  aFunc[0].iMem);.
30d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30da0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30db0 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20  Close, iCsr);.  
30dc0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d        explainSim
30dd0 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c  pleCount(pParse,
30de0 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20   pTab, pBest);. 
30df0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
30e00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
30e10 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
30e20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
30e30 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
30e40 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
30e50 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30e60 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
30e70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
30e80 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
30e90 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
30ea0 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
30eb0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
30ec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30ed0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
30ee0 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
30ef0 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
30f00 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
30f10 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
30f20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
30f30 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
30f40 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
30f50 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
30f60 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
30f70 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
30f80 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
30f90 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
30fa0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
30fb0 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
30fc0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
30fd0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
30fe0 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
30ff0 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
31000 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
31010 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
31020 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
31030 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
31040 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
31050 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
31060 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
31070 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
31080 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
31090 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
310a0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
310b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
310c0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
310d0 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
310e0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
310f0 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
31100 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
31110 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61  odify behavior a
31120 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
31130 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31140 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72     + If the quer
31150 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d  y is a "SELECT m
31160 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65  in(x)", then the
31170 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20   loop coded by. 
31180 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68         **     wh
31190 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74  ere.c should not
311a0 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e   iterate over an
311b0 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20  y values with a 
311c0 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20  NULL value.     
311d0 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e     **     for x.
311e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
311f0 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f      **   + The o
31200 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e  ptimizer code in
31210 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68   where.c (the th
31220 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73  ing that decides
31230 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
31240 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
31250 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
31260 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
31270 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
31280 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   on .        ** 
31290 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74      satisfying t
312a0 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c  he 'ORDER BY' cl
312b0 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65  ause than it doe
312c0 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73  s in other cases
312d0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
312e0 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
312f0 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
31300 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
31310 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
31320 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
31330 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  *pMinMax = 0;.  
31340 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20        u8 flag = 
31350 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
31360 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20  RMAL;.        . 
31370 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31380 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
31390 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
313a0 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20   flag==0 );.    
313b0 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
313c0 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ng==0 ){.       
313d0 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
313e0 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c  Query(&sAggInfo,
313f0 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20   &pMinMax);.    
31400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
31410 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c  sert( flag==0 ||
31420 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20   (pMinMax!=0 && 
31430 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
31440 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  1) );..        i
31450 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
31460 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
31470 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
31480 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30  p(db, pMinMax, 0
31490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
314a0 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
314b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
314c0 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
314d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
314e0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
314f0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
31500 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
31510 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
31520 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
31530 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
31540 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
31550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31560 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
31570 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
31580 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
31590 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
315a0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
315b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
315c0 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
315d0 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
315e0 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
315f0 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
31600 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
31610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31620 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
31630 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
31640 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
31650 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
31660 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
31670 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
31680 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61  e, pMinMax,0,fla
31690 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  g,0);.        if
316a0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
316b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
316c0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
316d0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
316e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
316f0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
31700 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63         updateAcc
31710 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
31720 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31730 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69       assert( pMi
31740 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d  nMax==0 || pMinM
31750 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  ax->nExpr==1 );.
31760 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
31770 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
31780 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20  d(pWInfo)>0 ){. 
31790 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
317a0 56 64 62 65 41 64 64 47 6f 74 6f 28 76 2c 20 73  VdbeAddGoto(v, s
317b0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
317c0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
317d0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
317e0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
317f0 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
31800 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
31810 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
31820 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
31830 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
31840 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
31850 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
31860 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
31870 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
31880 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31890 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
318a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
318b0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
318c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
318d0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
318e0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
318f0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
31900 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
31910 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
31920 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
31930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31940 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
31950 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
31960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31970 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
31980 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
31990 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
319a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
319b0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
319c0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
319d0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
319e0 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
319f0 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
31a00 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
31a10 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
31a20 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
31a30 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
31a40 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
31a50 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
31a60 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
31a70 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
31a80 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
31a90 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
31aa0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
31ab0 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
31ac0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
31ad0 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
31ae0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
31af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31b00 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42         sSort.nOB
31b10 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
31b20 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
31b30 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
31b40 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
31b50 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
31b60 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
31b70 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
31b80 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
31b90 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
31ba0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
31bb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
31bc0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
31bd0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
31be0 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
31bf0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
31c00 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
31c10 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
31c20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
31c30 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
31c40 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
31c50 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
31c60 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
31c70 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
31c80 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
31c90 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
31ca0 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
31cb0 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
31cc0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
31cd0 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
31ce0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
31cf0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
31d00 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
31d10 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
31d20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
31d30 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
31d40 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
31d50 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
31d60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
31d70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
31d80 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
31d90 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
31da0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
31db0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
31dc0 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
31dd0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
31de0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
31df0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
31e00 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
31e10 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45  o.aFunc);.#if SE
31e20 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31e30 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
31e40 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
31e50 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
31e60 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  ;.  pParse->nSel
31e70 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
31e80 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
31e90 0a 7d 0a                                         .}.