/ Hex Artifact Content
Login

Artifact e8eccb5b4482965f56fc46c69e75ce2da941b18e:


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 53 54 45 52 49 53 4b 2c 30 29 29 3b  TK_ASTERISK,0));
0fb0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0fc0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0fd0: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0ff0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1000: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1010: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1020: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1030: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1040: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1050: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
1060: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
1070: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
1080: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1090: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10a0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10b0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
10c0: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
10d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
10e0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
10f0: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1100: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1110: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
1120: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20  arse->nErr>0 || 
1130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1140: 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 61  !=0 );.  pNew->a
1150: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
1160: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
1170: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
1180: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
1190: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
11a0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
11b0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
11c0: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
11d0: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
11e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
11f0: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1200: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1220: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1230: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1240: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
1250: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1260: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1270: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1280: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1290: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
12a0: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
12b0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
12c0: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
12d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12e0: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
12f0: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
1300: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
1310: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
1320: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
1330: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
1340: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1350: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1360: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1370: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1380: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1390: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
13a0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
13b0: 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 1);.}../*.** 
13c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
13d0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
13e0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
13f0: 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ent in a compoun
1400: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c  d..*/.static Sel
1410: 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f  ect *findRightmo
1420: 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  st(Select *p){. 
1430: 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74   while( p->pNext
1440: 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   ) p = p->pNext;
1450: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1460: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f  /*.** Given 1 to
1470: 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70   3 identifiers p
1480: 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  receding the JOI
1490: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
14a0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
14b0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
14c0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
14d0: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
14e0: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
14f0: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
1500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
1510: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
1520: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
1530: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
1540: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
1550: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
1560: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
1570: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
1580: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
1590: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
15a0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
15b0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
15c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
15d0: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
15e0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
15f0: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
1600: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
1610: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
1620: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
1630: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1640: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1650: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
1660: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1670: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
1680: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
1690: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
16a0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
16b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20  .  Token *p;.   
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30            /*   0
16e0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
16f0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1700: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
1710: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78  nst char zKeyTex
1720: 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66  t[] = "naturalef
1730: 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e  touterightfullin
1740: 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61  nercross";.  sta
1750: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1760: 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20   {.    u8 i;    
1770: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
1780: 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74   of keyword text
1790: 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a   in zKeyText[] *
17a0: 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20  /.    u8 nChar; 
17b0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
17c0: 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63  the keyword in c
17d0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20  haracters */.   
17e0: 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a   u8 code;     /*
17f0: 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20   Join type mask 
1800: 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b  */.  } aKeyword[
1810: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74  ] = {.    /* nat
1820: 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c  ural */ { 0,  7,
1830: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20   JT_NATURAL     
1840: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1850: 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20    /* left    */ 
1860: 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54  { 6,  4, JT_LEFT
1870: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1880: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74     },.    /* out
1890: 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c  er   */ { 10, 5,
18a0: 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20   JT_OUTER       
18b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
18c0: 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20    /* right   */ 
18d0: 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48  { 14, 5, JT_RIGH
18e0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
18f0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c     },.    /* ful
1900: 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c  l    */ { 19, 4,
1910: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
1920: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
1930: 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20    /* inner   */ 
1940: 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 23, 5, JT_INNE
1950: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1960: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f     },.    /* cro
1970: 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c  ss   */ { 28, 5,
1980: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
1990: 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  SS         },.  
19a0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
19b0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
19c0: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
19d0: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
19e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
19f0: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1a00: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1a10: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1a20: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  0; j<ArraySize(a
1a30: 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a  Keyword); j++){.
1a40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1a50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61  aKeyword[j].nCha
1a60: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
1a70: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1a80: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b  (char*)p->z, &zK
1a90: 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b  eyText[aKeyword[
1aa0: 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20  j].i], p->n)==0 
1ab0: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1ac0: 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b  ype |= aKeyword[
1ad0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1af0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1b00: 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31  se( j==0 || j==1
1b10: 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33   || j==2 || j==3
1b20: 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35   || j==4 || j==5
1b30: 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20   || j==6 );.    
1b40: 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65  if( j>=ArraySize
1b50: 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20  (aKeyword) ){.  
1b60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1b70: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1b90: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1ba0: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1bb0: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1bc0: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1bd0: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1be0: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
1bf0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
1c00: 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20  t char *zSp = " 
1c10: 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ";.    assert( p
1c20: 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  B!=0 );.    if( 
1c30: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20  pC==0 ){ zSp++; 
1c40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1c50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1c60: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1c70: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1c80: 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54   ".       "%T %T
1c90: 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a  %s%T", pA, pB, z
1ca0: 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  Sp, pC);.    joi
1cb0: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1cc0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a  ;.  }else if( (j
1cd0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1ce0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ER)!=0 .        
1cf0: 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20   && (jointype & 
1d00: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48  (JT_LEFT|JT_RIGH
1d10: 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a  T))!=JT_LEFT ){.
1d20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d30: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1d40: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1d50: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1d60: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1d70: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1d80: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1d90: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1da0: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1db0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1dc0: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1dd0: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
1de0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
1df0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
1e00: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1e10: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1e20: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1e30: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1e40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1e50: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1e60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1e70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1e80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1e90: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1ea0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1eb0: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
1ee0: 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65  he first N table
1ef0: 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20  s in pSrc, from 
1f00: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c  left to right, l
1f10: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20  ooking for a.** 
1f20: 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61  table that has a
1f30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43   column named zC
1f40: 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ol.  .**.** When
1f50: 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54   found, set *piT
1f60: 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f  ab and *piCol to
1f70: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78   the table index
1f80: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   and column inde
1f90: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63  x.** of the matc
1fa0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  hing column and 
1fb0: 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a  return TRUE..**.
1fc0: 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  ** If not found,
1fd0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
1fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62  /.static int tab
1ff0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
2010: 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  c,       /* Arra
2020: 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  y of tables to s
2030: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e  earch */.  int N
2040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2050: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
2060: 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  les in pSrc->a[]
2070: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2090: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
20a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72  the column we ar
20b0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
20c0: 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20  .  int *piTab,  
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20e0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
20f0: 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  a[] here */.  in
2100: 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20  t *piCol        
2110: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
2120: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69  x of pSrc->a[*pi
2130: 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Tab].pTab->aCol[
2140: 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ] here */.){.  i
2150: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2160: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2170: 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
2180: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2190: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
21a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
21b0: 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f  umn matching zCo
21c0: 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
21d0: 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43  (piTab==0)==(piC
21e0: 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f  ol==0) );  /* Bo
21f0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72  th or neither ar
2200: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  e NULL */.  for(
2210: 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  i=0; i<N; i++){.
2220: 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d      iCol = colum
2230: 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69  nIndex(pSrc->a[i
2240: 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  ].pTab, zCol);. 
2250: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
2260: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61  {.      if( piTa
2270: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69  b ){.        *pi
2280: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Tab = i;.       
2290: 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a   *piCol = iCol;.
22a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
22b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
22c0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
22f0: 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65  add terms implie
2300: 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78  d by JOIN syntax
2310: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
2320: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
2330: 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  on of a SELECT s
2340: 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65  tatement. The ne
2350: 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a  w term, which.**
2360: 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74   is ANDed with t
2370: 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52  he existing WHER
2380: 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20  E clause, is of 
2390: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
23a0: 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20     (tab1.col1 = 
23b0: 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a  tab2.col2).**.**
23c0: 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74   where tab1 is t
23d0: 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65  he iSrc'th table
23e0: 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63   in SrcList pSrc
23f0: 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65   and tab2 is the
2400: 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68   .** (iSrc+1)'th
2410: 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73  . Column col1 is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74   column iColLeft
2430: 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f   of tab1, and co
2440: 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  l2 is.** column 
2450: 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62  iColRight of tab
2460: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
2470: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
2480: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24b0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
24c0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
24e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46  t of tables in F
24f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2500: 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20  int iLeft,      
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
2530: 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20  t table to join 
2540: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2550: 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20   iColLeft,      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2570: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2580: 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a  in first table *
2590: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20  /.  int iRight, 
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
25c0: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20  second table in 
25d0: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
25e0: 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  olRight,        
25f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2600: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
2610: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  second table */.
2620: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69    int isOuterJoi
2630: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2640: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2650: 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f  s is an OUTER jo
2660: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  in */.  Expr **p
2670: 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  pWhere          
2680: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2690: 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  T: The WHERE cla
26a0: 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f  use to add to */
26b0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
26d0: 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45    Expr *pE1;.  E
26e0: 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72  xpr *pE2;.  Expr
26f0: 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74   *pEq;..  assert
2700: 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29  ( iLeft<iRight )
2710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2720: 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b  ->nSrc>iRight );
2730: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2740: 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29  >a[iLeft].pTab )
2750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2760: 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62  ->a[iRight].pTab
2770: 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c   );..  pE1 = sql
2780: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2790: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
27a0: 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b  Left, iColLeft);
27b0: 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33  .  pE2 = sqlite3
27c0: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
27d0: 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68  (db, pSrc, iRigh
27e0: 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a  t, iColRight);..
27f0: 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50    pEq = sqlite3P
2800: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2810: 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20 30 29  EQ, pE1, pE2, 0)
2820: 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20 69  ;.  if( pEq && i
2830: 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20  sOuterJoin ){.  
2840: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2850: 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f  y(pEq, EP_FromJo
2860: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2870: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2880: 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f  y(pEq, EP_TokenO
2890: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
28a0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
28b0: 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  AProperty(pEq, E
28c0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
28d0: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
28e0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
28f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
2900: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2910: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2920: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2940: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2950: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2960: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2970: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2980: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2990: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
29a0: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
29b0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
29c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
29d0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
29e0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
29f0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
2a00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2a10: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2a20: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2a30: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2a40: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2a50: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2a60: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2a70: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2a80: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2a90: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2aa0: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
2ab0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
2ac0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
2ad0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
2ae0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
2af0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
2b00: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2b10: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2b20: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2b30: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2b40: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2b50: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2b60: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2b70: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2b80: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2b90: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2ba0: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
2bb0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
2bc0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
2bd0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
2be0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
2bf0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
2c00: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2c10: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2c30: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2c40: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2c50: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2c60: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2c70: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2c80: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2c90: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2ca0: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2cb0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2cc0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
2cd0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
2ce0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
2cf0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
2d00: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2d10: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2d20: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2d30: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2d40: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2d50: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2d60: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2d70: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2d80: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2d90: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2da0: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2db0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
2dc0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
2dd0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
2de0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
2df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e00: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2e10: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2e20: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2e30: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2e40: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2e50: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2e60: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e70: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
2e80: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2e90: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2ea0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
2eb0: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e  Reduce);.    p->
2ec0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ed0: 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20  = (i16)iTable;. 
2ee0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
2ef0: 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e  _FUNCTION && p->
2f00: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
2f10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
2f20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c  r(i=0; i<p->x.pL
2f30: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2f40: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69  {.        setJoi
2f50: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
2f60: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
2f70: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
2f80: 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e     }.    setJoin
2f90: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
2fa0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
2fb0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
2fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2fd0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
2fe0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
2ff0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
3000: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3010: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3020: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
3030: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
3040: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
3050: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
3060: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
3070: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
3080: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
3090: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
30a0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
30b0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
30c0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
30d0: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
30e0: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
30f0: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
3100: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
3110: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
3120: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
3130: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
3140: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
3150: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
3160: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
3170: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
3180: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
3190: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
31a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
31b0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
31c0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
31d0: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
31e0: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
31f0: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
3200: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
3210: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
3220: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
3230: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3240: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3250: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
3260: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3270: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
3280: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
3290: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
32a0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
32d0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
32e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3310: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
3320: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3330: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
3340: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
3350: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
3360: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3370: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
3380: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
3390: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
33a0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
33b0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
33c0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
33d0: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
33e0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
33f0: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
3400: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
3410: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
3420: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
3430: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
3440: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3450: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3460: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
3470: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
3480: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
3490: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
34a0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
34b0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
34c0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
34d0: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
34e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
34f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3500: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3510: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3520: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3530: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3540: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3550: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3560: 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  f( pRight->fg.jo
3570: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
3580: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
3590: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
35a0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
35b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
35d0: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
35e0: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
35f0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
3600: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3610: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
3620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3630: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
3640: 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e  ; j<pRightTab->n
3650: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3660: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3670: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
3680: 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74  umn in the right
3690: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
36a0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
36b0: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66   /* Matching lef
36c0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
36d0: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
36e0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f    /* Matching co
36f0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74  lumn in the left
3700: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
3710: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68     zName = pRigh
3720: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
3730: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3740: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
3750: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3760: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3770: 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20  iLeftCol) ){.   
3780: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3790: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
37a0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
37b0: 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20  l, i+1, j,.     
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
37e0: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
37f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3800: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
3810: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3820: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
3830: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
3840: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3850: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
3860: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3870: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3880: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3890: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
38a0: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
38b0: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
38c0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
38d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
38e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
38f0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
3900: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
3910: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
3920: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
3930: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
3940: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
3950: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3960: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
3970: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
3980: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
3990: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
39a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
39b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
39c0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
39d0: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
39e0: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
39f0: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
3a00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3a10: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
3a20: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
3a30: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
3a40: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
3a50: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3a60: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
3a70: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
3a80: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
3a90: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
3aa0: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
3ab0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
3ac0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
3ad0: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
3ae0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
3af0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
3b00: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
3b10: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
3b20: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
3b30: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
3b40: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
3b50: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
3b60: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
3b70: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3b80: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3b90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3ba0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3bb0: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3bc0: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3bd0: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3be0: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3bf0: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3c00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3c10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c20: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53  e term in the US
3c30: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
3c40: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b        int iLeft;
3c50: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
3c60: 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68  on the left with
3c70: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
3c90: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3ca0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3cb0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3cc0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66  olumn on the lef
3cd0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  t */.        int
3ce0: 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a   iRightCol;   /*
3cf0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3d00: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3d10: 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  n on the right *
3d20: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3d30: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a   = pList->a[j].z
3d40: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52  Name;.        iR
3d50: 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e  ightCol = column
3d60: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
3d70: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3d80: 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30   if( iRightCol<0
3d90: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61  .         || !ta
3da0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3db0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3dc0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3dd0: 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29  ftCol).        )
3de0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
3df0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3e00: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
3e10: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
3e20: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
3e30: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
3e40: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
3e50: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
3e60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3e70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3e80: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3e90: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ea0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3eb0: 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a  i+1, iRightCol,.
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3ee0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
3f00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
3f10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3f20: 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e   */.static KeyIn
3f30: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
3f40: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
3f50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3f60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3f70: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3f80: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
3f90: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
3fa0: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
3fb0: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
3fc0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
3fd0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
3fe0: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
3ff0: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
4000: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4010: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4020: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
4030: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
4040: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
4050: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4060: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
4070: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65   in registers re
4080: 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68  gData.** through
4090: 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31   regData+nData-1
40a0: 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   onto the sorter
40b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
40c0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
40d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
40e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
40f0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4100: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4110: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4120: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
4130: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4140: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
4150: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
4160: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
4170: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4180: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20  int regData,    
4190: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
41a0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
41b0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
41c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
41d0: 72 69 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f  rigData,       /
41e0: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
41f0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65   holding data be
4200: 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a  fore packing */.
4210: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
4220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4230: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4240: 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61 79  n the data array
4250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
4260: 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  xReg         /* 
4270: 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72  No. of reg prior
4280: 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61 69   to regData avai
4290: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f  lable for use */
42a0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
42b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75         /* Stmt u
42e0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
42f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20  n */.  int bSeq 
4300: 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  = ((pSort->sortF
4310: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
4320: 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a  UseSorter)==0);.
4330: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53    int nExpr = pS
4340: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
4350: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
4360: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44     /* No. of ORD
4370: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
4380: 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78   int nBase = nEx
4390: 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74  pr + bSeq + nDat
43a0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
43b0: 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73    /* Fields in s
43c0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
43d0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int 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 20 20                  
4400: 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73     /* Regs for s
4410: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4420: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
4430: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20     /* Assembled 
4460: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4470: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4480: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20  pSort->nOBSat;  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
44b0: 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f  terms to skip */
44c0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
44f0: 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72 65  to add sorter re
4500: 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a  cord to sorter *
4510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
4520: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
4530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61  );.  assert( nDa
4540: 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61  ta==1 || regData
4550: 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 20 29 3b  ==regOrigData );
4560: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
4570: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
4580: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78   nPrefixReg==nEx
4590: 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72  pr+bSeq );.    r
45a0: 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61  egBase = regData
45b0: 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b   - nExpr - bSeq;
45c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
45d0: 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
45e0: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50  nMem + 1;.    pP
45f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42  arse->nMem += nB
4600: 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ase;.  }.  sqlit
4610: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4620: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4630: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
4640: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
4650: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4660: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
4670: 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
4680: 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20  TE_ECEL_REF);.  
4690: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
46a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46b0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
46c0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
46d0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
46e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
46f0: 65 66 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20  efixReg==0 ){.  
4700: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4710: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4720: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
4730: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
4740: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
4750: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4760: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4770: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4780: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4790: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
47a0: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
47b0: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
47c0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
47d0: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
47e0: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
47f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4800: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4810: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
4820: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
4830: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
4840: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4850: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4860: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4870: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4880: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4890: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
48a0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
48b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
48c0: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
48d0: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
48e0: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
48f0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4900: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4910: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4920: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4930: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4940: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4950: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4960: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4970: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4980: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4990: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
49a0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
49b0: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
49c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
49d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
49e0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
49f0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4a00: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a20: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4a30: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4a40: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4a50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4a60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4a70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4a80: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4a90: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4aa0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4ab0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4ac0: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4ad0: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4ae0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4af0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4b00: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4b10: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4b20: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4b30: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4b40: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4b50: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4b60: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
4b70: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4b80: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4b90: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4ba0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4bb0: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4bc0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4bd0: 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e   testcase( pKI->
4be0: 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20 20  nXField>2 );.   
4bf0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4c00: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4c10: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4c20: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4c30: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
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 20                  
4c60: 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64      pKI->nXField
4c70: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4c80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4c90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cb0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4cc0: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4cd0: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4ce0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4cf0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4d00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4d10: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4d20: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4d30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4d40: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
4d50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
4d60: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
4d70: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
4d80: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
4d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4da0: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
4db0: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
4dc0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4dd0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4de0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
4df0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4e00: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4e10: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
4e20: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
4e30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4e40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4e50: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
4e60: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
4e70: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4e80: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
4e90: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
4ea0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
4eb0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
4ec0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
4ed0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4ee0: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
4ef0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
4f00: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
4f10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
4f20: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
4f30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4f40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4f50: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4f60: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4f70: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
4f80: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4f90: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
4fb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4fc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
4fd0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 30 2c  Zero, iLimit, 0,
4fe0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
4ff0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
5000: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5010: 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69  P_Last, pSort->i
5020: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
5030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5040: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53  v, OP_Delete, pS
5050: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
5060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5070: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5080: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5090: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
50a0: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
50b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
50c0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
50d0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
50e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
50f0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
5100: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
5110: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5120: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5130: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5140: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5150: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5160: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5170: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5180: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
51a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
51b0: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
51c0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
51d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
51e0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
51f0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
5200: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
5210: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5220: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5230: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5240: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5250: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5260: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5270: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5280: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5290: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
52a0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
52b0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
52c0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
52d0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
52e0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
52f0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
5300: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
5310: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5320: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5330: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5340: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5350: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5360: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5370: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5390: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
53a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
53b0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
53c0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
53d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
53e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
53f0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5400: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5410: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5420: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5430: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5440: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5450: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5460: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5480: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5490: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
54a0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
54b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
54c0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
54d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
54e0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
54f0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5500: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5510: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5520: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5530: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5540: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5560: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5570: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5580: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5590: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
55a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
55b0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
55c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
55d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
55e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
55f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
5600: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
5610: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
5620: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
5630: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
5640: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
5650: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
5660: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
5670: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
5680: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
5690: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
56a0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
56b0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
56c0: 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64  e the error used
56d0: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20   to occur.** in 
56e0: 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e  multiple places.
56f0: 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c    (The error onl
5700: 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20  y occurs in one 
5710: 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77  place now, but w
5720: 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20  e.** retain the 
5730: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69  subroutine to mi
5740: 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72  nimize code disr
5750: 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74  uption.).*/.stat
5760: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
5770: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
5780: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
5790: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
57a0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
57b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
57c0: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
57d0: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
57e0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
57f0: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
5800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5810: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5820: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
5830: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
5840: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5850: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
5860: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
5870: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
5880: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
5890: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
58a0: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
58b0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
58c0: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
58d0: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
58e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
58f0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
5900: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5910: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5920: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
5930: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5940: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5950: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5960: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5970: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5980: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5990: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
59a0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
59b0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
59c0: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
59d0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
59e0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
59f0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5a00: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5a10: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5a20: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5a30: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5a40: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5a50: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62   .** to get numb
5a60: 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  er columns and t
5a70: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
5a80: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5a90: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5aa0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ac0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5ad0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ae0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5b00: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5b10: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5b20: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
5b30: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
5b40: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
5b50: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
5b60: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
5b70: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
5b80: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
5b90: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
5ba0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
5bb0: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ort,         /* 
5bc0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
5bd0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
5be0: 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ess ORDER BY */.
5bf0: 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70    DistinctCtx *p
5c00: 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20  Distinct, /* If 
5c10: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
5c20: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
5c30: 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53   DISTINCT */.  S
5c40: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5c50: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
5c60: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
5c70: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5c80: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
5c90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5ca0: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
5cb0: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
5cc0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
5cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5ce0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
5cf0: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
5d00: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
5d10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5d20: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
5d30: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
5d40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
5d50: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
5d60: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
5d70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ent */.  int reg
5d80: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
5d90: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
5da0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
5db0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
5dc0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
5dd0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
5de0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5df0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
5e00: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
5e10: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
5e20: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
5e30: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
5e40: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
5e50: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
5e60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5e70: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
5e80: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
5e90: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5ea0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
5eb0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
5ec0: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20   regResult */.. 
5ed0: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
5ee0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5ef0: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
5f00: 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f  ct = pDistinct ?
5f10: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
5f20: 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49  tType : WHERE_DI
5f30: 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69  STINCT_NOOP;.  i
5f40: 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72  f( pSort && pSor
5f50: 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
5f60: 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66   pSort = 0;.  if
5f70: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68  ( pSort==0 && !h
5f80: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
5f90: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69    assert( iConti
5fa0: 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f  nue!=0 );.    co
5fb0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
5fc0: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5fd0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
5fe0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
5ff0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
6000: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45   nResultCol = pE
6010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
6020: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
6030: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
6040: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  Sort ){.      nP
6050: 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74  refixReg = pSort
6060: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
6070: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70  r;.      if( !(p
6080: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
6090: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
60a0: 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52  rter) ) nPrefixR
60b0: 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  eg++;.      pPar
60c0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65  se->nMem += nPre
60d0: 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  fixReg;.    }.  
60e0: 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
60f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
6100: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6110: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6120: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
6130: 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c  st->iSdst+nResul
6140: 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e  tCol > pParse->n
6150: 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Mem ){.    /* Th
6160: 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63  is is an error c
6170: 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61  ondition that ca
6180: 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78  n result, for ex
6190: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45  ample, when a SE
61a0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  LECT.    ** on t
61b0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
61c0: 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  de of an INSERT 
61d0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65  contains more re
61e0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
61f0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61  n.    ** there a
6200: 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
6210: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  e table on the l
6220: 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20  eft.  The error 
6230: 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20  will be caught. 
6240: 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74     ** and report
6250: 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77  ed later.  But w
6260: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
6270: 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ure enough memor
6280: 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20  y is allocated. 
6290: 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f     ** to avoid o
62a0: 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72  ther spurious er
62b0: 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e  rors in the mean
62c0: 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  time. */.    pPa
62d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
62e0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70  sultCol;.  }.  p
62f0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52  Dest->nSdst = nR
6300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52  esultCol;.  regR
6310: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
6320: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
6330: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
6340: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6350: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6360: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6370: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6380: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
6390: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
63a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
63b0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
63c0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
63d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
63e0: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
63f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
6400: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
6410: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
6420: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
6430: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
6440: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
6450: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
6460: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
6470: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
6480: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
6490: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
64a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
64b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
64c0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
64d0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
64e0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
64f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6500: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
6510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6520: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6530: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
6540: 20 72 65 67 52 65 73 75 6c 74 2c 20 30 2c 20 65   regResult, 0, e
6550: 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  celFlags);.  }..
6560: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
6570: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
6580: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
6590: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
65a0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
65b0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
65c0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
65d0: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
65e0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
65f0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
6600: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
6610: 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  ct ){.    switch
6620: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
6630: 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ctType ){.      
6640: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
6650: 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
6660: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
6670: 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op;            /
6680: 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * No longer requ
6690: 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72  ired OpenEphemer
66a0: 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20  al instr. */.   
66b0: 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20       int iJump; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66d0: 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
66e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
66f0: 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
6700: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
6710: 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  row content */..
6720: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
6730: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
6740: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
6750: 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65  /.        regPre
6760: 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
6770: 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  +1;.        pPar
6780: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
6790: 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ultCol;..       
67a0: 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f   /* Change the O
67b0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
67c0: 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f  coded earlier to
67d0: 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20   an OP_Null.    
67e0: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
67f0: 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20  MEM_Cleared bit 
6800: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67  on the first reg
6810: 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20  ister of the.   
6820: 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
6830: 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69   value.  This wi
6840: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f  ll cause the OP_
6850: 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61  Ne below to alwa
6860: 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  ys.        ** fa
6870: 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  il on the first 
6880: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
6890: 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68   loop even if th
68a0: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
68b0: 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55  ** row is all NU
68c0: 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  LLs..        */.
68d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
68e0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
68f0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6900: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6910: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
6920: 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74  beGetOp(v, pDist
6930: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6940: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
6950: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
6960: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
6970: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 1;.        pOp
6980: 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a  ->p2 = regPrev;.
6990: 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d  .        iJump =
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
69b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65  entAddr(v) + nRe
69c0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20  sultCol;.       
69d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
69e0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
69f0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6a00: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
6a10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
6a20: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
6a30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
6a40: 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74     if( i<nResult
6a50: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Col-1 ){.       
6a60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp3(v, OP_Ne,
6a80: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a   regResult+i, iJ
6a90: 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  ump, regPrev+i);
6aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
6ab0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6ac0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6ad0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6ae0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6af0: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
6b00: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
6b10: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6b20: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6b30: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
6b50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b60: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
6b70: 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50   char *)pColl, P
6b80: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ba0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
6bb0: 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
6bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
6bd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
6be0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6bf0: 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73  ==iJump || pPars
6c00: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6c10: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  led );.        s
6c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c30: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
6c40: 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c  Result, regPrev,
6c50: 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a   nResultCol-1);.
6c60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6c70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
6c80: 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
6c90: 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
6ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6cb0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6cc0: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6cd0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ct);.        bre
6ce0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
6cf0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
6d10: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6d20: 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
6d30: 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a  CT_UNORDERED );.
6d40: 20 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74          codeDist
6d50: 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69  inct(pParse, pDi
6d60: 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c  stinct->tabTnct,
6d70: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73   iContinue, nRes
6d80: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6da0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
6db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6dc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
6dd0: 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ort==0 ){.      
6de0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
6df0: 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
6e00: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nue);.    }.  }.
6e10: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
6e20: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
6e30: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
6e40: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
6e50: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
6e60: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
6e70: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
6e80: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
6e90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6ea0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
6eb0: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
6ec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
6ed0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
6ee0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6ef0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
6f00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6f20: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6f30: 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20  ltCol, r1);.    
6f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f50: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6f60: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
6f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6f80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6f90: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
6fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6fb0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
6fc0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
6fd0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
6fe0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
6ff0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
7000: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
7010: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
7020: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
7030: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
7040: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
7050: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
7060: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
7070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7090: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
70a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
70b0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
70c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
70d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
70e0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
70f0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
7100: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
7110: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
7120: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
7130: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
7140: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
7150: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
7160: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
7170: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
7180: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
7190: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
71a0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
71b0: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
71c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
71d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
71e0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
71f0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7200: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
7210: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7220: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
7230: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7240: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
7250: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
7260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7270: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7280: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7290: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
72a0: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
72b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
72c0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
72d0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
72e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
72f0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
7300: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
7310: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
7320: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
7330: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
7340: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
7350: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
7360: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
7370: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
7380: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
7390: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
73a0: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
73b0: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
73c0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
73d0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
73e0: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
73f0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
7400: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
7410: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
7420: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
7430: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
7440: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7450: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
7460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7470: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
7480: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
7490: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
74a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
74b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
74c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
74d0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
74e0: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
74f0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7500: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7510: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7520: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7530: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7540: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7550: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
7560: 72 65 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65  regResult,1,nPre
7570: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
7580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7590: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
75a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
75b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
75d0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
75e0: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
75f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7600: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7610: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
7620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7630: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
7640: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
7660: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7670: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
7680: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
7690: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
76a0: 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65  pParse, r1, nPre
76b0: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
76c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
76d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
76e0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
76f0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
7700: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
7710: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
7720: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
7730: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
7740: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
7750: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
7760: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
7770: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
7780: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
7790: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
77a0: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
77b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
77c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
77d0: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
77e0: 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
77f0: 61 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20  affSdst =.      
7800: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7810: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
7820: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
7830: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
7840: 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66  fSdst);.      if
7850: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7860: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
7870: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
7880: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
7890: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
78a0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
78b0: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
78c0: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
78d0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
78e0: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
78f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
7900: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
7910: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
7920: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
7930: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
7940: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
7950: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
7960: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7970: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7980: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
7990: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
79a0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
79b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
79c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
79d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
79e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
79f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7a00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7a10: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7a20: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7a30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7a40: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
7a50: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
7a60: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
7a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7a80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a90: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7aa0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7ab0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7ac0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7af0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7b00: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7b10: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7b20: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7b30: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7b40: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
7b50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7b70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
7b80: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
7b90: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7ba0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7bb0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7bc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7bd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7be0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7bf0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7c00: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7c10: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7c20: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7c30: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7c40: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7c50: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7c60: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7c70: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7c80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7c90: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7ca0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7cb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7cc0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cd0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7ce0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7cf0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65  regResult, regRe
7d00: 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78  sult, 1, nPrefix
7d10: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7d20: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7d30: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50  t( regResult==iP
7d40: 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  arm );.        /
7d50: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
7d60: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
7d70: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
7d80: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
7d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7da0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
7db0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7dc0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
7dd0: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
7de0: 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65  ine:       /* Se
7df0: 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d  nd data to a co-
7e00: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63  routine */.    c
7e10: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
7e20: 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  {        /* Retu
7e30: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  rn the results *
7e40: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
7e50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7e60: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7e70: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7e80: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
7e90: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7ea0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
7eb0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7ec0: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
7ed0: 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  sult, regResult,
7ee0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b      nPrefixReg);
7f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7f20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7f30: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
7f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f50: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7f60: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
7f70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
7fa0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
7fb0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7fd0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7fe0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7ff0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8000: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
8010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8020: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8030: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
8040: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
8050: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
8060: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
8070: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
8080: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
8090: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
80a0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
80b0: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
80c0: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
80d0: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
80e0: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
80f0: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
8100: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
8110: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
8120: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
8130: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
8140: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
8150: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
8160: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
8170: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
8180: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
8190: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
81a0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
81b0: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
81c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
81d0: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
81e0: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
81f0: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
8200: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
8210: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
8220: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
8230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
8240: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
8250: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
8260: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
8270: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
8280: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
8290: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
82a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
82b0: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
82c0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
82d0: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
82e0: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
82f0: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
8300: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8310: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
8320: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
8330: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
8340: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
8350: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
8360: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
8370: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
8380: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
8390: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
83a0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
83b0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
83c0: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
83d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
83e0: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
83f0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8400: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8410: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8440: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8450: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8460: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8490: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
84a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
84b0: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
84c0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
84d0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
84e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
84f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8500: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8510: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8520: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8530: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8540: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8550: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8560: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8570: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8580: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8590: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
85c0: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
85d0: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8620: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8630: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8650: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8660: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8670: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
8680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8690: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
86a0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
86b0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
86c0: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
86d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
86e0: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
86f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8700: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8720: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8730: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
8740: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
8750: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8760: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8770: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
8780: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8790: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
87a0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
87b0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
87c0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
87d0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
87e0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
87f0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
8800: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
8810: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
8820: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
8830: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
8840: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
8850: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
8860: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
8870: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
8880: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
8890: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
88a0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
88b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
88c0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
88d0: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
88e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
88f0: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
8900: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8910: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
8920: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
8930: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
8940: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
8950: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
8960: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
8970: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
8980: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
8990: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
89a0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
89b0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
89c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
89d0: 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
89e0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
89f0: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
8a00: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
8a10: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
8a20: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8a30: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
8a40: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
8a50: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
8a60: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
8a70: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
8a80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
8a90: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
8aa0: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
8ab0: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
8ac0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8ad0: 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (0, .           
8ae0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b          sizeof(K
8af0: 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a  eyInfo) + (N+X)*
8b00: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
8b10: 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29  )+1));.  if( p )
8b20: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
8b30: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
8b40: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
8b50: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
8b60: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c  N;.    p->nXFiel
8b70: 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20  d = (u16)X;.    
8b80: 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
8b90: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  ;.    p->db = db
8ba0: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
8bb0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8bc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8bd0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
8be0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
8bf0: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
8c00: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
8c10: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
8c20: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
8c30: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8c40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8c50: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8c60: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8c70: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
8c80: 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b  te3DbFree(0, p);
8c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8ca0: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8cb0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8cc0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8cd0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8ce0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8cf0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8d00: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8d10: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
8d20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8d30: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
8d40: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
8d50: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
8d60: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8d70: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
8d80: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
8d90: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
8da0: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
8db0: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
8dc0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
8dd0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
8de0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8df0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
8e00: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8e10: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
8e20: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
8e30: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
8e40: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
8e50: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
8e60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8e70: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
8e80: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
8e90: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
8ea0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
8eb0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
8ec0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
8ed0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8ee0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8ef0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
8f00: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8f10: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8f20: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8f30: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8f40: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
8f50: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
8f60: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
8f70: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
8f80: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
8f90: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
8fa0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
8fb0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
8fc0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
8fd0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
8fe0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
8ff0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
9000: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
9010: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9020: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9030: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9040: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9050: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9060: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9070: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9080: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9090: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
90a0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
90b0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
90c0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
90d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
90e0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
90f0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9100: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9110: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9120: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9130: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9140: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9150: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9160: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9170: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9180: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9190: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
91a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
91b0: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
91c0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
91d0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
91e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
91f0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9200: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9210: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9220: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9230: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9240: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9250: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9260: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9280: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9290: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
92a0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
92b0: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
92c0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
92d0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
92e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
92f0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9300: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9310: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9320: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9330: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9340: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9350: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9360: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9370: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9380: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9390: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
93a0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
93b0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
93c0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
93d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
93e0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
93f0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9400: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9410: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9420: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9430: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9440: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9450: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9460: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9470: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9480: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9490: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
94a0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
94b0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
94c0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
94d0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
94e0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
94f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9500: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9510: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9530: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9540: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9560: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9570: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9590: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
95a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
95b0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
95c0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
95d0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
95e0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
95f0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9600: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9610: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9620: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
9630: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
9640: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
9650: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
9660: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
9670: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
9680: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9690: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
96a0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
96b0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
96c0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
96d0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
96e0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
96f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9700: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9710: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9720: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
9730: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
9740: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
9750: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
9760: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
9770: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
9780: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9790: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
97a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
97b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
97c0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
97d0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
97e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
97f0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9800: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9810: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9820: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
9840: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
9850: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
9860: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
9870: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
9880: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9890: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
98a0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
98b0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
98c0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
98d0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
98e0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
98f0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9900: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9910: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9920: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
9930: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9940: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
9950: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
9960: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
9970: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
9980: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9990: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
99a0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
99b0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
99c0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
99d0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
99e0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
99f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9a00: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9a10: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9a20: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
9a30: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
9a40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9a50: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
9a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9a70: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9a80: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9a90: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9aa0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9ab0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9ac0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9ad0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9ae0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9af0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9b00: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9b10: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9b20: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9b30: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
9b40: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
9b50: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
9b60: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9b70: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
9b80: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9b90: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9ba0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9bb0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9bc0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9bd0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9be0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9bf0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9c00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9c10: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9c20: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9c30: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9c40: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9c50: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9c60: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9c70: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9c80: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9c90: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9ca0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9cb0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9cc0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9cd0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9ce0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9cf0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9d00: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9d10: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9d20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9d30: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9d70: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9da0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9db0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
9dc0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9de0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9df0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9e20: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9e30: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9e50: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9e60: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9e70: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
9e80: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
9e90: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
9ea0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
9eb0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
9ec0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9ed0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9ee0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9ef0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9f00: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9f10: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9f20: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9f30: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9f40: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9f50: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9f60: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9f70: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
9f80: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
9f90: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
9fa0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9fb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9fc0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9fd0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9fe0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9ff0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a000: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a010: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
a020: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
a030: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
a040: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
a050: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
a060: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
a070: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
a080: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
a090: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
a0a0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
a0b0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
a0c0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
a0d0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
a0e0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
a0f0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
a100: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
a110: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
a120: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
a130: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
a140: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
a150: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
a160: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
a170: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
a180: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a190: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a1a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a1b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a1c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a1d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a1e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a1f0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a200: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a210: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a220: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a230: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a240: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a250: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a260: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a270: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a280: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a290: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a2a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a2b0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a2d0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a2e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a2f0: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
a300: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a310: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
a320: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a330: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a340: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a350: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a360: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a370: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a380: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a390: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a3a0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a3b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a3c0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a3d0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a3e0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a3f0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a400: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a410: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a420: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a430: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a440: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a460: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a470: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a480: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a4b0: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a4c0: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a4d0: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a500: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a510: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a520: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a530: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a540: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a550: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a560: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a570: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a580: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a590: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a5a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a5b0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a5c0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a5d0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a5e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a5f0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
a600: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
a610: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a620: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
a630: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
a640: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
a650: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
a660: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a670: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
a680: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72  routine ){.    r
a690: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
a6a0: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
a6b0: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
a6c0: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
a6d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a6e0: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
a6f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a700: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
a710: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a720: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a730: 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20  nSortData = 1;. 
a740: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
a750: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
a760: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
a770: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
a780: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
a790: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
a7a0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
a7b0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a7c0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
a7d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
a7e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
a7f0: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a800: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
a810: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
a820: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
a830: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
a840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a850: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
a860: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
a870: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
a880: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
a890: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
a8a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a8b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
a8c0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
a8d0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a8e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a8f0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
a900: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
a910: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a920: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a930: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a940: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a960: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
a970: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
a980: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
a990: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
a9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a9b0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a9c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a9d0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a9e0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a9f0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
aa00: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
aa10: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
aa20: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
aa30: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
aa40: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
aa50: 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74  (i=0; i<nSortDat
aa60: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  a; i++){.    sql
aa70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa80: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
aa90: 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71  rtTab, nKey+bSeq
aaa0: 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  +i, regRow+i);. 
aab0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
aac0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
aad0: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
aae0: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
aaf0: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
ab00: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
ab10: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
ab20: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
ab30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
ab50: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
ab60: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
ab90: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
aba0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
abb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
abc0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
abd0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
abe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
abf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ac00: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
ac10: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
ac20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ac30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ac40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ac50: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ac60: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
ac70: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
ac90: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
aca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
acb0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
acc0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
acd0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
ace0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
acf0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
ad00: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
ad10: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
ad20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ad30: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
ad40: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
ad50: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
ad60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
ad70: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
ad80: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
ad90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
ada0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
adb0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
adc0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
add0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ade0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
adf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ae00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ae10: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
ae20: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
ae30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ae40: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
ae50: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
ae60: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
ae70: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ae80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ae90: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
aea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aeb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
aec0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
aed0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
aee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aef0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
af00: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
af10: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
af20: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
af30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
af40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
af50: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
af60: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
af70: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
af80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
af90: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
afa0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
afb0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
afc0: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
afd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
afe0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
aff0: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  d);.  }.  /* The
b000: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
b010: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
b020: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b030: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
b040: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
b050: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
b060: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
b070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b080: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b090: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
b0a0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
b0b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
b0c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
b0d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b0e0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
b0f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b100: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
b110: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
b120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b130: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
b140: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
b150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b160: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b170: 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f  addrBreak);.}../
b180: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
b190: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
b1a0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
b1b0: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
b1c0: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
b1d0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
b1e0: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
b1f0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
b200: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
b210: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
b220: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
b230: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
b240: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
b250: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
b260: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
b270: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
b280: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b290: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
b2a0: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
b2b0: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
b2c0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
b2d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b2e0: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
b2f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b300: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
b310: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b320: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
b330: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
b340: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
b350: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
b360: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b370: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
b380: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
b390: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
b3a0: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
b3b0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
b3c0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
b3d0: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
b3e0: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
b3f0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b400: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
b410: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
b420: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
b430: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
b440: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b450: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b460: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b470: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
b480: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
b490: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
b4a0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
b4b0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b4c0: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
b4d0: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
b4e0: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
b4f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b500: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
b510: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
b520: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
b530: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b540: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
b550: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b560: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
b570: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
b580: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
b590: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b5a0: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
b5b0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b5c0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b5d0: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
b5e0: 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a  ,D,E,F).#else /*
b5f0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
b600: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b610: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
b620: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b630: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b640: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b650: 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61  ,B,F).#endif.sta
b660: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b670: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b680: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b690: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b6a0: 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr,.#ifdef SQLIT
b6b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b6c0: 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74  METADATA.  const
b6d0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b6e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b6f0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b700: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b710: 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75  gCol,.#endif.  u
b720: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
b730: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
b740: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
b750: 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20  ;.  u8 estWidth 
b760: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
b770: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b780: 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72  _METADATA.  char
b790: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
b7a0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b7b0: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
b7c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b7d0: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e  OrigCol = 0;.#en
b7e0: 64 69 66 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  dif..  if( NEVER
b7f0: 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e  (pExpr==0) || pN
b800: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
b810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
b820: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b830: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
b840: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
b850: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
b860: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b870: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
b880: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
b890: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
b8a0: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
b8b0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
b8c0: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
b8d0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
b8e0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
b8f0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
b900: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
b910: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
b920: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
b930: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
b940: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
b950: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
b960: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b970: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
b980: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
b990: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
b9a0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
b9b0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b9c0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
b9d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
b9e0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
b9f0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
ba00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ba10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
ba20: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
ba30: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ba40: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
ba50: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
ba60: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
ba70: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
ba80: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
ba90: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
baa0: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
bab0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
bac0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
bad0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
bae0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
baf0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
bb00: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
bb10: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
bb20: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
bb30: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
bb40: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
bb50: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
bb60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bb70: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
bb80: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bb90: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
bba0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
bbb0: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
bbc0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
bbd0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
bbe0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
bbf0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
bc00: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
bc10: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
bc20: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
bc30: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
bc40: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
bc50: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
bc60: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
bc70: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
bc80: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
bc90: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
bca0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
bcb0: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
bcc0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
bcd0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
bce0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
bcf0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bd00: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
bd10: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
bd20: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
bd30: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
bd40: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
bd50: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
bd60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
bd70: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
bd80: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
bd90: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
bda0: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
bdb0: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
bdc0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bdd0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
bde0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
bdf0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
be00: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
be10: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
be20: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
be30: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
be40: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
be50: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
be60: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
be70: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
be80: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
be90: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bea0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
beb0: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
bec0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
bed0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
bee0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
bef0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
bf00: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
bf10: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
bf20: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
bf30: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bf40: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
bf50: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
bf60: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
bf70: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
bf80: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
bf90: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
bfa0: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
bfb0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
bfc0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
bfd0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bfe0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
bff0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c000: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
c010: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
c020: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
c030: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
c040: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
c050: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
c060: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
c070: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
c080: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
c090: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
c0a0: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
c0b0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
c0c0: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
c0d0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
c0e0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
c0f0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
c100: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
c110: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
c120: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
c130: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
c140: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
c150: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
c160: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
c170: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
c180: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
c190: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
c1a0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
c1b0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
c1c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
c1d0: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
c1e0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
c1f0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
c200: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
c210: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
c220: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c230: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
c240: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
c250: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c260: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
c270: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c280: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
c290: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
c2a0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
c2b0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c2c0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
c2d0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
c2e0: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
c2f0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
c300: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
c310: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
c320: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
c330: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
c340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c350: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
c360: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c370: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
c390: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
c3a0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
c3b0: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
c3c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c3d0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c3e0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c3f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
c400: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
c410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c420: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
c430: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c440: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c450: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c460: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c470: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
c480: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c490: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
c4a0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
c4b0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
c4c0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c4d0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
c4e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
c4f0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
c500: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
c510: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
c520: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c530: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
c540: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
c550: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c560: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
c570: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
c580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
c590: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
c5a0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
c5b0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
c5c0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
c5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c5e0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
c5f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
c600: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c610: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c620: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c630: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
c660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c670: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
c680: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
c690: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c6a0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
c6b0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
c6c0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c6d0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
c6e0: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
c6f0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
c700: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
c710: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
c720: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
c730: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
c740: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
c750: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
c760: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
c770: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
c780: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c790: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c7a0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
c7b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
c7c0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
c7d0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
c7e0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c7f0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
c800: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
c810: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
c820: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c830: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c840: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c850: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c860: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
c870: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
c880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c890: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
c8a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c8b0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c8c0: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
c8d0: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
c8e0: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
c8f0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
c900: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
c910: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
c920: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
c930: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
c940: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
c950: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
c960: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
c970: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
c980: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
c990: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c9a0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c9b0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
c9c0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c9d0: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
c9e0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
c9f0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
ca00: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
ca10: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
ca20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca30: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
ca40: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
ca50: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
ca60: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
ca70: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
ca80: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
ca90: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
caa0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
cab0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
cac0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
cad0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
cae0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
caf0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
cb00: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
cb10: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
cb20: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
cb30: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
cb40: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
cb50: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
cb60: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
cb70: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
cb80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
cb90: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
cba0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
cbb0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
cbc0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
cbd0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
cbe0: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
cbf0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
cc00: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
cc10: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
cc20: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
cc30: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
cc40: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
cc50: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
cc60: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
cc70: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
cc80: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
cc90: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
cca0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
ccb0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
ccc0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
ccd0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
cce0: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
ccf0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
cd00: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
cd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cd20: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cd30: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
cd40: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
cd50: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cd60: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cd70: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cd80: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
cd90: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
cda0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
cdb0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cdc0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cdd0: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
cde0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cdf0: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
ce00: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
ce10: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
ce20: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
ce30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ce40: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
ce50: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
ce60: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
ce70: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
ce80: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ce90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
cea0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
ceb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
cec0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
ced0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
cee0: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
cef0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
cf00: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
cf10: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
cf20: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
cf30: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
cf40: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
cf50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cf60: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cf70: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
cf80: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
cf90: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
cfa0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
cfb0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
cfc0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
cfd0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
cfe0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
cff0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
d000: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
d010: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d020: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
d030: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d040: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d050: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
d060: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
d070: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d080: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
d090: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
d0a0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
d0b0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
d0c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
d0d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d0e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
d0f0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
d100: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
d110: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
d120: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
d130: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
d140: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
d150: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
d160: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
d170: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
d180: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
d190: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d1a0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
d1b0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
d1c0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
d1d0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
d1e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
d1f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
d200: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
d210: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
d220: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d230: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
d240: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d250: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
d260: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
d270: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
d280: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d290: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d2a0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d2b0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d2c0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
d2d0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d2e0: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
d2f0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
d300: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
d310: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
d320: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
d330: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
d340: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
d350: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
d360: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
d370: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
d380: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
d390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d3a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
d3b0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
d3c0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
d3d0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
d3e0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
d3f0: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
d400: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
d410: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
d420: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
d430: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
d440: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d450: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
d460: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
d470: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
d480: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d490: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
d4a0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
d4b0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
d4c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d4d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
d4e0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
d4f0: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
d500: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
d510: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d520: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d530: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
d540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
d550: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
d560: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
d570: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d590: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
d5a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d5b0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
d5c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
d5d0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
d5e0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
d5f0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
d600: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d610: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d620: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
d630: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d640: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d660: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d670: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d680: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
d690: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
d6a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d6b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
d6c0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d6d0: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
d6e0: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
d6f0: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
d700: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
d710: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d720: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
d730: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d740: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d750: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
d760: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
d770: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
d780: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
d790: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
d7a0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
d7b0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
d7c0: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
d7d0: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
d7e0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
d7f0: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
d800: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
d810: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d820: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
d830: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
d840: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
d850: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
d860: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
d870: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
d880: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
d890: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
d8a0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
d8b0: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
d8c0: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
d8d0: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
d8e0: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
d8f0: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
d900: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
d910: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
d920: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d930: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
d940: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
d950: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
d960: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
d970: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
d980: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d990: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
d9a0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
d9b0: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
d9c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
d9d0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d9e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d9f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
da00: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
da10: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
da20: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
da30: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
da40: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
da50: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
da60: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
da70: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
da80: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
da90: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
daa0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
dab0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
dac0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
dad0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
dae0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
daf0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db10: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
db20: 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20  s */.  u32 cnt; 
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
db50: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
db60: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
db70: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
db80: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
db90: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
dba0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
dbb0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
dbe0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
dbf0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
dc00: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
dc10: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
dc20: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
dc30: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
dc40: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
dc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc60: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
dc70: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
dca0: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20   in zName[] */. 
dcb0: 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20   Hash ht;       
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcd0: 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f  Hash table of co
dce0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  lumn names */.. 
dcf0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
dd00: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c  (&ht);.  if( pEL
dd10: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
dd20: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
dd30: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
dd40: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
dd50: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
dd60: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
dd70: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
dd80: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
dd90: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
dda0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Col = 0;.  }.  *
ddb0: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
ddc0: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
ddd0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
dde0: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
ddf0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
de00: 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
de10: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
de20: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
de30: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
de40: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
de50: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
de60: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
de70: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
de80: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
de90: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dea0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
deb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dec0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
ded0: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dee0: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
def0: 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  me */.    }else{
df00: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
df10: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
df20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
df30: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
df40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
df50: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
df60: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
df70: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
df80: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
df90: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
dfa0: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
dfb0: 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
dfc0: 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70      pColExpr = p
dfd0: 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ColExpr->pRight;
dfe0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dff0: 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a   pColExpr!=0 );.
e000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e010: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
e020: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
e030: 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54  AYS(pColExpr->pT
e040: 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ab!=0) ){.      
e050: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
e060: 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20   use the column 
e070: 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  name name */.   
e080: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
e090: 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  pColExpr->iColum
e0a0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  n;.        pTab 
e0b0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
e0c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
e0d0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
e0e0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
e0f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
e100: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
e110: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
e120: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e130: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e140: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e170: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e180: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e190: 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
e1a0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
e1b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e1c0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
e1d0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
e1e0: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
e1f0: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
e200: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
e210: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
e220: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
e230: 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
e240: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e250: 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  db, "%s", zName)
e260: 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  ;..    /* Make s
e270: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
e280: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
e290: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
e2a0: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
e2b0: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
e2c0: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
e2d0: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
e2e0: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
e2f0: 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
e300: 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
e310: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
e320: 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
e330: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
e340: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e350: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
e360: 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
e370: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
e380: 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
e390: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e3a0: 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
e3b0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
e3c0: 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
e3d0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
e3e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e3f0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e400: 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
e410: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
e420: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
e430: 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
e440: 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
e450: 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
e460: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
e470: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
e480: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
e490: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 43 6f 6c  iesFromName(pCol
e4a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
e4b0: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49   && sqlite3HashI
e4c0: 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65  nsert(&ht, zName
e4d0: 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b  , pCol)==pCol ){
e4e0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
e4f0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
e500: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
e510: 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
e520: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e530: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
e540: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
e550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e560: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
e570: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
e580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e590: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
e5a0: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
e5b0: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
e5c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e5d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
e5e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e5f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
e600: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
e610: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
e620: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
e630: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
e640: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
e650: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
e660: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
e670: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
e680: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
e690: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
e6a0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
e6b0: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
e6c0: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
e6d0: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
e6e0: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
e6f0: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
e700: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
e710: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
e720: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
e730: 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
e740: 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
e750: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
e760: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
e770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
e780: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
e790: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
e7a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e7b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e7c0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
e7d0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
e7e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
e7f0: 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
e800: 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
e810: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
e820: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
e830: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
e840: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
e850: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
e860: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
e870: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
e880: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
e890: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
e8a0: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
e8b0: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
e8c0: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
e8d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e8e0: 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20  *a;.  u64 szAll 
e8f0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
e900: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
e910: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
e920: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
e930: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
e940: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
e950: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
e960: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
e970: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e980: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
e990: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
e9a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
e9b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
e9c0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
e9d0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
e9e0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
e9f0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
ea00: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
ea10: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
ea20: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
ea30: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
ea40: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
ea50: 66 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  f( pCol->zType==
ea60: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
ea70: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
ea80: 44 62 53 74 72 44 75 70 28 64 62 2c 20 0a 20 20  DbStrDup(db, .  
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54 79 70 65        columnType
eab0: 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20  (&sNC, p,0,0,0, 
eac0: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a  &pCol->szEst));.
ead0: 20 20 20 20 7d 0a 20 20 20 20 73 7a 41 6c 6c 20      }.    szAll 
eae0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
eaf0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
eb00: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
eb10: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
eb20: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
eb30: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
eb40: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
eb50: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
eb60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
eb70: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
eb80: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
eb90: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
eba0: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
ebb0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
ebc0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
ebd0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
ebe0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
ebf0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
ec00: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
ec10: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
ec20: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
ec30: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
ec40: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
ec50: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
ec60: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
ec70: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
ec80: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
ec90: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
eca0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
ecb0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
ecc0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
ecd0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
ece0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ecf0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
ed00: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
ed10: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
ed20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
ed30: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
ed40: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
ed50: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
ed60: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
ed70: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
ed80: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
ed90: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
eda0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
edb0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
edc0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
edd0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
ede0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
edf0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
ee00: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
ee10: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ee20: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
ee30: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
ee40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ee50: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
ee60: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ee70: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
ee80: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
ee90: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
eea0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
eeb0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
eec0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
eed0: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
eee0: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
eef0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
ef00: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
ef10: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
ef20: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
ef30: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
ef40: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
ef50: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
ef60: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ef70: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
ef80: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
ef90: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
efa0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
efb0: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
efc0: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
efd0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
efe0: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
eff0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f000: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
f010: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
f020: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f030: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
f040: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
f050: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
f060: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
f070: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
f080: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
f090: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
f0a0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f0b0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
f0c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
f0d0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
f0e0: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
f0f0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
f100: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f110: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
f120: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
f130: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
f140: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
f150: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f160: 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  v ) sqlite3VdbeA
f170: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp0(v, OP_Init
f180: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
f190: 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a  e->pToplevel==0.
f1a0: 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
f1b0: 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
f1c0: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
f1d0: 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
f1e0: 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73    ){.      pPars
f1f0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
f200: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d   = 1;.    }..  }
f210: 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a  .  return v;.}..
f220: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f230: 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
f240: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
f250: 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
f260: 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
f270: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78  t and pOffset ex
f280: 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d  pressions.  pLim
f290: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68  it and pOffset h
f2a0: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
f2b0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
f2c0: 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
f2d0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
f2e0: 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
f2f0: 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
f300: 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
f310: 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
f320: 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
f330: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f340: 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
f350: 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
f360: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
f370: 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
f380: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
f390: 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
f3a0: 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
f3b0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
f3c0: 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
f3d0: 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
f3e0: 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
f3f0: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
f400: 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
f410: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
f420: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f430: 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
f440: 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
f450: 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
f460: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e  mit and pOffset.
f470: 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20    iLimit and.** 
f480: 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
f490: 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
f4a0: 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
f4b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
f4c0: 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
f4d0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
f4e0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
f4f0: 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
f500: 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
f510: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
f520: 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
f530: 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
f540: 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
f550: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
f560: 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
f570: 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
f580: 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
f590: 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
f5a0: 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
f5b0: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
f5c0: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
f5d0: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
f5e0: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
f5f0: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
f600: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
f610: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
f620: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
f630: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
f640: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
f650: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
f660: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
f670: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f690: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
f6a0: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
f6b0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
f6c0: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56  int iBreak){.  V
f6d0: 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e  dbe *v = 0;.  in
f6e0: 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  t iLimit = 0;.  
f6f0: 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69  int iOffset;.  i
f700: 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  nt n;.  if( p->i
f710: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
f720: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
f730: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
f740: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
f750: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
f760: 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
f770: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
f780: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
f790: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
f7a0: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
f7b0: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
f7c0: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
f7d0: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
f7e0: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
f7f0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
f800: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
f810: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
f820: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
f830: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
f840: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
f850: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
f860: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f870: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
f880: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
f8a0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
f8b0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
f8c0: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29  r(p->pLimit, &n)
f8d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f8e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f8f0: 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
f900: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
f910: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
f920: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
f930: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
f940: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f950: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
f960: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
f970: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
f980: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
f990: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
f9a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
f9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f9c0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f9d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f9e0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
f9f0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
fa00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fa10: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
fa20: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
fa30: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
fa40: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fa50: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
fa60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fa80: 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69  IfNot, iLimit, i
fa90: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
faa0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
fab0: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
fac0: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
fad0: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
fae0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
faf0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
fb00: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
fb10: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
fb20: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
fb30: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
fb40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fb50: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
fb60: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
fb90: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
fba0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fbb0: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
fbc0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
fbd0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
fbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fbf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49  ddOp3(v, OP_SetI
fc00: 66 4e 6f 74 50 6f 73 2c 20 69 4f 66 66 73 65 74  fNotPos, iOffset
fc10: 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  , iOffset, 0);. 
fc20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
fc40: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
fc50: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
fc60: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
fc70: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
fc80: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ET"));.      sql
fc90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fca0: 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73  , OP_SetIfNotPos
fcb0: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
fcc0: 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  t+1, -1);.    }.
fcd0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
fce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
fcf0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
fd00: 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
fd10: 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
fd20: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
fd30: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
fd40: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
fd50: 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
fd60: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
fd70: 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
fd80: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
fd90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
fda0: 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
fdb0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
fdc0: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
fdd0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
fde0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
fdf0: 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
fe00: 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
fe10: 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
fe20: 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
fe30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fe40: 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
fe50: 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
fe60: 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
fe70: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
fe80: 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
fe90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
fea0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
feb0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
fec0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
fed0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
fee0: 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
fef0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
ff00: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
ff10: 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a   iCol>=0 );.  /*
ff20: 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65   iCol must be le
ff30: 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73  ss than p->pELis
ff40: 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72  t->nExpr.  Other
ff50: 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f  wise an error wo
ff60: 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  uld.  ** have be
ff70: 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67  en thrown during
ff80: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
ff90: 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f   and we would no
ffa0: 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20  t have gotten.  
ffb0: 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20  ** this far */. 
ffc0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
ffd0: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70  ALWAYS(iCol<p->p
ffe0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
fff0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
10000 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
10010 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
10020 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
10030 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
10040 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
10050 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
10060 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
10070 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
10080 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  r is a compound 
10090 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61  SELECT.** with a
100a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
100b0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
100c0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
100d0 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f  eturns a KeyInfo
100e0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75  .** structure su
100f0 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65  itable for imple
10100 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
10110 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  R BY..**.** Spac
10120 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
10130 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
10140 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
10150 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c   malloc. The cal
10160 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
10170 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
10180 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
10190 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
101a0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
101b0 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
101c0 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74  ic KeyInfo *mult
101d0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
101e0 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
101f0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
10200 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45  int nExtra){.  E
10210 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10220 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
10230 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20  .  int nOrderBy 
10240 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  = p->pOrderBy->n
10250 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20  Expr;.  sqlite3 
10260 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10270 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65  ;.  KeyInfo *pRe
10280 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  t = sqlite3KeyIn
10290 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
102a0 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b  erBy+nExtra, 1);
102b0 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
102c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
102d0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
102e0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  y; i++){.      s
102f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
10300 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f  tem *pItem = &pO
10310 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20  rderBy->a[i];.  
10320 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
10330 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
10340 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10350 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28  Coll;..      if(
10360 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
10370 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
10380 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
10390 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
103a0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b  (pParse, pTerm);
103b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
103c0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
103d0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
103e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65  (pParse, p, pIte
103f0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
10400 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ol-1);.        i
10410 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
10420 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
10430 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  oll;.        pOr
10440 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
10450 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  r =.          sq
10460 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
10470 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
10480 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e  , pTerm, pColl->
10490 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
104a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
104b0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
104c0 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b  iteable(pRet) );
104d0 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f  .      pRet->aCo
104e0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
104f0 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74       pRet->aSort
10500 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
10510 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
10520 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
10530 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
10540 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10550 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
10560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
10570 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
10580 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
10590 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54  content of a WIT
105a0 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71  H RECURSIVE.** q
105b0 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
105c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72  :.**.**   <recur
105d0 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28  sive-table> AS (
105e0 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e  <setup-query> UN
105f0 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72  ION [ALL] <recur
10600 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20  sive-query>).** 
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
10630 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20  ____/           
10640 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
10650 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20   p->pPrior      
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  p.**.**.** There
106a0 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
106b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
106c0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
106d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
106e0 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73  use.** of recurs
106f0 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65  ive-query, marke
10700 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
10710 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63  st->a[].fg.isRec
10720 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
10730 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
10740 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
10750 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
10760 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
10770 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
10780 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
10790 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
107a0 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
107b0 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
107c0 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
107d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
107e0 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
107f0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
10800 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
10810 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
10820 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
10830 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
10840 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10850 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
10860 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
10870 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
10880 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
10890 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
108a0 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
108b0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
108c0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
108d0 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
108e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
108f0 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
10900 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
10910 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
10920 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
10930 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
10940 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
10950 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
10960 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
10970 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
10980 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
10990 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
109a0 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
109b0 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
109c0 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
109d0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
109e0 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
109f0 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
10a00 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
10a10 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
10a20 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
10a30 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10a40 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
10a50 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
10a60 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
10a70 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
10a80 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
10a90 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
10aa0 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
10ab0 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
10ac0 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
10ad0 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
10ae0 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
10af0 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
10b00 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
10b10 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10b20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
10b30 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
10b40 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
10b50 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
10b60 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
10b70 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
10b80 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
10b90 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
10ba0 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
10bb0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
10bc0 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
10bd0 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
10be0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
10bf0 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
10c00 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
10c10 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
10c20 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
10c30 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
10c40 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
10c50 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
10c60 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
10c70 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
10c80 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
10c90 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
10ca0 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
10cb0 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
10cc0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
10cd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10ce0 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
10cf0 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
10d00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10d10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10d20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10d30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10d40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
10d50 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
10d60 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10d70 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10d80 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
10d90 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
10da0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
10db0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
10dc0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
10dd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
10de0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
10df0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
10e00 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
10e10 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
10e20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
10e30 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
10e40 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
10e50 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
10e70 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10e80 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10e90 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
10ea0 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
10eb0 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
10ec0 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
10ed0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10ef0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
10f00 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
10f10 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
10f20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
10f30 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
10f40 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
10f50 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
10f60 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
10f70 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10f80 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fa0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
10fb0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
10fc0 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
10ff0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
11000 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
11010 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
11020 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
11030 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
11040 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
11050 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
11060 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
11070 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
11080 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
11090 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
110a0 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
110b0 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
110c0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
110f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11100 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11120 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
11130 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11140 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
11150 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
11160 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
11170 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
11180 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11190 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
111a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
111b0 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
111c0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
111d0 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
111e0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
111f0 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
11200 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
11210 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11220 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
11230 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11240 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
11250 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
11260 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
11270 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
11280 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
11290 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
112a0 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
112b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
112c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
112d0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
112e0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
112f0 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
11300 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
11310 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
11320 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
11330 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
11340 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
11350 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
11360 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
11370 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
11380 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
11390 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
113a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
113b0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
113c0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
113d0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
113e0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
113f0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
11400 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
11410 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
11420 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
11430 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
11440 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
11450 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
11460 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11470 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
11480 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
11490 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
114a0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
114b0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
114c0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
114d0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
114e0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
114f0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
11500 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
11510 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
11520 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
11530 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
11540 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
11550 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
11560 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
11570 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
11580 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11590 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
115a0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
115b0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
115c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
115d0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
115e0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
115f0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
11600 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
11610 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
11620 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
11630 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
11640 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11650 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
11660 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
11670 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
11680 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
11690 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
116a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
116b0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
116c0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
116d0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
116e0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
116f0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
11700 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
11710 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
11720 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
11730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11740 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
11750 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
11760 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
11770 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
117a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
117b0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
117c0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
117d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
117e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
117f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11800 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
11810 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
11820 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
11830 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
11840 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
11850 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11860 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
11870 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11880 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11890 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
118a0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
118b0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
118c0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
118d0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
118e0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
118f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
11900 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
11910 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
11920 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
11930 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
11940 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
11950 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
11960 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
11970 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11980 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
11990 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
119a0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
119b0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
119c0 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
119d0 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
119e0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
119f0 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
11a00 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
11a10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
11a20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11a30 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
11a40 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
11a50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11a60 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
11a70 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
11a80 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
11a90 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
11aa0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11ab0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
11ac0 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
11ad0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
11ae0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
11af0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11b00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11b10 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
11b20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11b30 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
11b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11b60 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
11b70 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
11b80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11b90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11ba0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
11bb0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
11bc0 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
11bd0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
11be0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
11bf0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11c00 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
11c10 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
11c20 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
11c30 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
11c40 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
11c50 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
11c60 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
11c70 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
11c80 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
11c90 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11ca0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11cb0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
11cc0 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
11cd0 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
11ce0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
11cf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11d00 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
11d10 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
11d20 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
11d30 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
11d40 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
11d50 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
11d60 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
11d70 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
11d80 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
11d90 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
11da0 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
11db0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
11dc0 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
11dd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11de0 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
11df0 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
11e00 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
11e10 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
11e20 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
11e30 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
11e40 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
11e50 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11e60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
11e70 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ior==0 );.    p-
11e80 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70  >pPrior = pSetup
11e90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70  ;.  }..  /* Keep
11ea0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f   running the loo
11eb0 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  p until the Queu
11ec0 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  e is empty */.  
11ed0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
11ee0 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73  v, addrTop);.  s
11ef0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11f00 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
11f10 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65  eak);..end_of_re
11f20 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20  cursive_query:. 
11f30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11f40 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
11f50 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
11f60 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
11f70 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e   pOrderBy;.  p->
11f80 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
11f90 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
11fa0 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72  pOffset;.  retur
11fb0 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
11fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
11fd0 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
11fe0 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74  ferences */.stat
11ff0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12000 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
12010 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12020 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12030 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12040 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12050 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12060 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12070 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12080 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12090 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
120a0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
120b0 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  sults */.);../*.
120c0 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70  ** Handle the sp
120d0 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
120e0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
120f0 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
12100 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53  from a.** VALUES
12110 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e   clause.  By han
12120 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  dling this as a 
12130 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65  special case, we
12140 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72   avoid deep.** r
12150 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68  ecursion, and th
12160 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  us do not need t
12170 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51  o enforce the SQ
12180 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
12190 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e  UND_SELECT.** on
121a0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
121b0 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20  ..**.** Because 
121c0 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
121d0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
121e0 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  m a VALUES claus
121f0 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68  e:.**   (1) It h
12200 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  as no LIMIT or O
12210 46 46 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41  FFSET.**   (2) A
12220 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49  ll terms are UNI
12230 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20  ON ALL.**   (3) 
12240 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  There is no ORDE
12250 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73  R BY clause.*/.s
12260 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12270 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
12280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12290 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
122a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
122b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
122c0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
122d0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
122e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
122f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12300 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12310 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12320 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12330 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a  Select *pPrior;.
12340 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
12350 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
12360 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
12370 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
12380 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  lue );.  do{.   
12390 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
123a0 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
123b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
123c0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
123d0 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   (p->op==TK_SELE
123e0 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  CT && p->pPrior=
123f0 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
12400 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
12410 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12420 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  ->pOffset==0 );.
12430 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12440 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45  Next==0 || p->pE
12450 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e  List->nExpr==p->
12460 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
12470 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20  Expr );.    if( 
12480 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62  p->pPrior==0 ) b
12490 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
124a0 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ( p->pPrior->pNe
124b0 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d  xt==p );.    p =
124c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
124d0 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  nRow++;.  }while
124e0 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (1);.  while( p 
124f0 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  ){.    pPrior = 
12500 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
12510 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12530 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12540 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  pDest);.    p->p
12550 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
12560 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
12570 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ak;.    p->nSele
12580 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  ctRow = nRow;.  
12590 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
125a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
125b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
125c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
125d0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
125e0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
125f0 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
12600 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
12610 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
12620 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
12630 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
12640 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
12650 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
12660 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
12670 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
12680 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
12690 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
126a0 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
126b0 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
126c0 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
126d0 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
126e0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
126f0 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
12700 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
12710 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
12720 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
12730 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
12740 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
12750 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
12760 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
12770 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
12780 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
12790 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
127a0 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
127b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
127c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
127d0 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
127e0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
127f0 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
12800 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
12810 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
12820 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
12830 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
12840 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
12850 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
12860 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
12870 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
128a0 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
128b0 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
128c0 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
128d0 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
128e0 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
128f0 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
12900 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
12910 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
12920 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
12930 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
12940 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
12950 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
12960 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
12970 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
12980 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
12990 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
129a0 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
129b0 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
129c0 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
129d0 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
129e0 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
129f0 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
12a00 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
12a10 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12a20 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
12a30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12a40 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12a50 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12a60 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12a70 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12a80 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12a90 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12aa0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12ab0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12ac0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12ad0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
12ae0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12af0 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
12b00 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
12b10 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
12b20 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
12b30 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
12b40 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
12b50 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
12b60 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
12b70 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
12b80 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
12b90 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
12ba0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
12bb0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
12bc0 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
12bd0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
12be0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
12bf0 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
12c00 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
12c10 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
12c20 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
12c30 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12c40 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
12c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12c60 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d  IN.  int iSub1 =
12c70 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12c80 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
12c90 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
12ca0 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20   iSub2 = 0;     
12cb0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12cc0 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
12cd0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
12ce0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
12cf0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
12d00 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
12d10 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
12d20 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
12d30 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
12d40 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
12d50 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
12d60 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
12d70 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
12d80 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
12d90 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
12da0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
12db0 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
12dc0 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  h */.  assert( (
12dd0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12de0 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
12df0 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  | p->op==TK_ALL 
12e00 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  || p->op==TK_UNI
12e10 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  ON );.  db = pPa
12e20 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
12e30 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
12e40 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
12e50 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
12e60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
12e70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12e80 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
12e90 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
12ea0 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
12eb0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
12ec0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12ed0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12ee0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12ef0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
12f00 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
12f10 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12f20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12f30 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
12f40 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
12f50 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
12f60 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
12f70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12f80 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
12f90 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12fa0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
12fb0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12fc0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12fd0 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
12fe0 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
12ff0 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
13000 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
13010 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
13020 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
13030 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
13040 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
13050 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
13060 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
13070 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
13080 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
13090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
130a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
130b0 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
130c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
130d0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
130e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
130f0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
13100 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
13110 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
13120 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
13130 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
13140 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
13150 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
13160 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
13170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13180 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
13190 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
131a0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
131b0 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
131c0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
131d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
131e0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
131f0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
13200 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
13210 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
13220 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13230 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13240 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
13250 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13260 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
13270 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
13280 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13290 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
132a0 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
132b0 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
132c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
132d0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
132e0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
132f0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
13300 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
13310 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13320 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13330 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13340 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
13350 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
13360 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
13370 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
13380 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
13390 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
133a0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
133b0 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
133c0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
133d0 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
133e0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
133f0 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
13400 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
13410 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13420 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13430 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
13440 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
13450 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
13460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13470 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
13480 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13490 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
134a0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
134b0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
134c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
134d0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
134e0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
134f0 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
13500 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
13510 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13520 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13530 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13540 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13550 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13560 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
13570 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
13580 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
13590 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
135a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
135b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
135c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
135d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
135e0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
135f0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
13600 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
13610 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13620 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
13630 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
13640 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
13650 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13660 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13670 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
13680 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
13690 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
136a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
136b0 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
136c0 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
136d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
136e0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
136f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13700 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e  Op3(v, OP_SetIfN
13710 6f 74 50 6f 73 2c 20 70 2d 3e 69 4f 66 66 73 65  otPos, p->iOffse
13720 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30  t, p->iOffset, 0
13730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13740 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13750 2c 20 4f 50 5f 41 64 64 2c 20 70 2d 3e 69 4c 69  , OP_Add, p->iLi
13760 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  mit, p->iOffset,
13770 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 29 3b 0a   p->iOffset+1);.
13780 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13790 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
137a0 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20 70  P_SetIfNotPos, p
137b0 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
137c0 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20  fset+1, -1);.   
137d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
137e0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
137f0 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
13800 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13810 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13820 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13830 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13840 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13860 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
13870 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
13880 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13890 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
138a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
138b0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
138c0 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  w;.      if( pPr
138d0 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20  ior->pLimit.    
138e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
138f0 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
13900 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d  r->pLimit, &nLim
13910 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
13920 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
13930 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e  lectRow > (u64)n
13940 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
13950 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
13960 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a  ctRow = nLimit;.
13970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13980 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
13990 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
139a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
139b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
139c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
139d0 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
139e0 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
139f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
13a00 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
13a10 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
13a20 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
13a30 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
13a40 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70  t */.      u8 op
13a50 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f   = 0;       /* O
13a60 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
13a70 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
13a80 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
13a90 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
13aa0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
13ab0 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
13ac0 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
13ad0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
13ae0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
13af0 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
13b00 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
13b10 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
13b20 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
13b30 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
13b40 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
13b50 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
13b60 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
13b70 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
13b80 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13b90 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
13ba0 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
13bb0 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
13bc0 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
13bd0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  p ){.        /* 
13be0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
13bf0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
13c00 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
13c10 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
13c20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
13c30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13c40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
13c50 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
13c60 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13c70 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13c80 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
13c90 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
13ca0 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
13cb0 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
13cc0 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
13cd0 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13ce0 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
13cf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13d00 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
13d10 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
13d20 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
13d30 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
13d40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
13d50 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
13d60 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
13d70 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
13d80 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
13d90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
13da0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
13db0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
13dc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13de0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
13df0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
13e00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
13e10 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
13e20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
13e30 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13e40 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
13e50 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
13e60 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
13e70 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
13e80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13e90 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13ea0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13eb0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
13ec0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
13ed0 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
13ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
13ef0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13f00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13f10 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
13f20 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
13f30 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
13f40 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13f50 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
13f60 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13f70 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13f80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13f90 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
13fa0 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
13fb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13fc0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13fd0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13fe0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13ff0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
14000 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
14010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
14020 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
14030 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  PT ){.        op
14040 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
14050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14060 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
14070 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
14080 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
14090 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Union;.      }. 
140a0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
140b0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
140c0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
140d0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
140e0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
140f0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14100 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14110 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
14120 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
14130 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14140 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14150 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14160 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14170 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14180 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
14190 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
141a0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
141b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
141c0 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
141d0 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
141e0 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
141f0 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
14200 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
14210 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
14220 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
14230 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
14240 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
14250 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14260 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14270 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
14280 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14290 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
142a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
142b0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
142c0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
142d0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
142e0 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ON ) p->nSelectR
142f0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
14300 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
14310 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14320 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14330 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14340 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14350 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14360 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14370 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
14380 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14390 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
143a0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
143b0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
143c0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
143d0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
143e0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
143f0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
14400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14410 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
14420 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
14430 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
14440 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
14450 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
14460 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
14470 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14480 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14490 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
144a0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
144b0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
144c0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
144d0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
144e0 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
144f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
14500 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14510 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14520 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
14530 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14540 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
14550 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14570 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
14580 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14590 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
145a0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
145b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
145c0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
145d0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
145e0 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
145f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14600 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14610 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
14620 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14630 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14640 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
14650 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14660 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
14670 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14680 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14690 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
146c0 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
146d0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
146e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
146f0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
14700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14720 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
14730 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
14740 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14750 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14760 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14770 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
14780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14790 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
147a0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
147b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
147c0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
147d0 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
147e0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
147f0 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
14800 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
14810 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
14820 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
14830 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
14840 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
14850 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
14860 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
14870 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
14880 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
14890 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
148a0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
148b0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
148c0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
148d0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
148e0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
148f0 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
14900 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
14910 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
14920 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
14930 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
14940 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
14950 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14960 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
14970 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14990 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
149a0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
149b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
149c0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
149d0 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
149e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
149f0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14a00 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
14a10 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14a20 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
14a30 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14a40 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14a50 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14a70 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
14a80 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
14a90 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
14aa0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14ab0 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
14ac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
14ad0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14ae0 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
14af0 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
14b00 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
14b10 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b20 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b30 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14b50 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14b60 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
14b70 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
14b80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
14b90 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
14ba0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
14bb0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
14bc0 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
14bd0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
14be0 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
14bf0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
14c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c10 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14c20 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
14c30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14c40 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14c50 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
14c60 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14c70 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
14c80 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
14c90 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
14ca0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
14cb0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14cc0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14cd0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14ce0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14cf0 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
14d00 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
14d10 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
14d20 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14d30 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14d40 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14d60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14d80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14d90 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14da0 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
14db0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
14dc0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14dd0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
14de0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
14df0 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
14e00 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
14e10 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
14e20 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
14e30 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
14e40 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
14e50 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14e60 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
14e70 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
14e80 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
14e90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14ea0 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
14eb0 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
14ec0 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
14ed0 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
14ee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
14ef0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
14f00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
14f10 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
14f20 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
14f30 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
14f40 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
14f50 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
14f60 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
14f70 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
14f80 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
14f90 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14fa0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
14fb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14fc0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14fd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14fe0 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
14ff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15000 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15010 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
15020 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
15030 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15050 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15060 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20   tab1, iBreak); 
15070 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15080 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15090 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
150a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
150b0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
150c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
150d0 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
150e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
150f0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
15100 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
15110 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
15120 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15140 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15150 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15160 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
15170 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
15180 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
151b0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
151c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
151d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
151e0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
151f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15200 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
15210 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  1, iStart); Vdbe
15220 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
15240 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
15250 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15270 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
15280 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
15290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
152a0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
152b0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
152c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
152d0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
152e0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
152f0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
15300 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
15310 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
15320 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
15330 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
15340 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
15350 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
15360 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
15370 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
15380 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
15390 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
153a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
153b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
153c0 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
153d0 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
153e0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
153f0 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
15400 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
15410 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
15420 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
15430 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
15440 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
15450 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
15460 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
15470 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
15480 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
15490 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
154a0 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
154b0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
154c0 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
154d0 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
154e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
154f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15500 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15510 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
15520 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
15530 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
15540 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
15550 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
15560 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15580 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15590 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
155a0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
155b0 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
155c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
155d0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
155e0 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
155f0 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
15600 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
15610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15620 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
15630 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
15640 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15650 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
15660 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
15670 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
15680 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
15690 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
156a0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
156b0 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
156c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
156d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
156e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
156f0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
15700 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
15710 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
15720 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
15730 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
15740 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
15750 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15760 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
15770 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
15780 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
15790 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
157a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
157b0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
157c0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
157d0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
157e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
157f0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
15800 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
15810 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
15820 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
15830 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
15840 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
15850 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
15860 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
15870 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
15880 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
15890 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
158a0 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
158b0 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
158c0 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
158d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
158e0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
158f0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
15900 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15910 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
15920 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
15930 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
15940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15950 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
15960 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
15970 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
15980 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
159b0 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
159c0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
159d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
159e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
159f0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
15a00 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
15a10 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
15a20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
15a30 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
15a40 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
15a50 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
15a60 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
15a70 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
15a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15a90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15aa0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15ab0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  T */../*.** Erro
15ac0 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
15ad0 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
15ae0 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
15af0 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
15b00 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
15b10 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
15b20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
15b30 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
15b40 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
15b50 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
15b60 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
15b70 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
15b80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15b90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
15ba0 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
15bb0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
15bc0 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
15bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
15be0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15bf0 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
15c00 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
15c10 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
15c20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
15c30 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
15c40 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
15c50 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
15c60 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
15c70 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
15c80 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
15c90 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
15ca0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15cb0 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
15cc0 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
15cd0 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
15ce0 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
15cf0 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
15d00 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
15d10 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
15d20 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
15d30 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
15d40 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
15d50 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
15d60 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
15d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
15d80 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
15d90 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
15da0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
15db0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
15dc0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
15dd0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
15de0 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
15df0 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
15e00 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
15e10 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
15e20 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
15e30 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
15e40 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
15e50 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
15e60 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
15e70 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
15e80 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
15e90 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
15ea0 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
15eb0 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
15ec0 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
15ed0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
15ee0 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
15ef0 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
15f00 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
15f10 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
15f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
15f30 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15f40 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
15f50 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15f60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15f70 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15f80 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15f90 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
15fa0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
15fb0 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
15fc0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
15fd0 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
15fe0 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
15ff0 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
16000 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
16010 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
16020 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
16030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
16040 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
16050 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
16060 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
16070 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
16080 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
16090 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
160a0 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
160b0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
160c0 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
160d0 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
160e0 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
160f0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
16100 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
16110 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
16120 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
16130 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16140 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
16150 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
16160 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
16170 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16180 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
16190 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
161a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
161b0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
161c0 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
161d0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
161e0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
161f0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
16200 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
16210 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
16220 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16230 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
16240 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
16250 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16260 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
16270 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16280 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
16290 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
162a0 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
162d0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
162e0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
162f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
16300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16310 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
16320 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
16330 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
16340 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16350 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16360 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
16370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16380 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
16390 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
163a0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
163b0 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
163c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
163d0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
163e0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
163f0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16400 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
16410 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
16420 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
16430 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
16440 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
16450 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
16460 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
16470 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
16480 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
16490 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
164a0 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
164b0 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
164c0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
164d0 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
164e0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
164f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
16500 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
16510 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
16520 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
16530 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16540 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16550 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16560 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16570 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16580 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16590 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
165a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
165b0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
165c0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
165d0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
165e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
165f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
16600 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
16610 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
16620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16630 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16640 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16650 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16660 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16670 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16680 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16690 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
166a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
166b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
166c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
166d0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
166e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
166f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16700 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
16710 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
16720 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
16730 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
16740 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
16750 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
16760 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
16770 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
16780 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
16790 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
167a0 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
167b0 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
167c0 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
167d0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
167e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
167f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16800 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16810 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16820 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
16830 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
16840 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
16850 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
16860 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
16870 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
16880 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16890 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
168a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
168b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
168c0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
168d0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
168e0 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
168f0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
16900 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
16910 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
16920 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
16930 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
16940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16950 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16960 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16970 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16980 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16990 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
169a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
169b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
169c0 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
169d0 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
169e0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
169f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
16a00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
16a10 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
16a20 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
16a30 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
16a40 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
16a50 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
16a60 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
16a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16a80 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16a90 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16aa0 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
16ab0 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
16ac0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16ad0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16ae0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
16af0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
16b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
16b10 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
16b20 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
16b30 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
16b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16b50 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
16b60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16b70 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16b80 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16b90 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16ba0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16bb0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16bc0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16bd0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
16be0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
16bf0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16c00 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
16c10 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
16c20 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
16c30 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16c40 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16c50 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16c60 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16c70 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16c80 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16c90 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16ca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16cb0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16cc0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16cd0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16ce0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16cf0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d00 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16d10 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16d30 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16d40 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16d50 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16d60 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16d70 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
16d80 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
16d90 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
16da0 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
16db0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
16dc0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
16dd0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16de0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16df0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16e00 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16e10 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16e20 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16e30 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16e40 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16e50 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16e60 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16e70 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
16e80 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
16e90 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
16ea0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
16eb0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16ec0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
16ed0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16ee0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16f10 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16f20 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16f40 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16f50 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16f60 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16f70 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16f80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16f90 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16fa0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16fb0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16fc0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16fd0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
17000 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
17010 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
17020 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17030 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
17040 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
17050 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
17060 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17070 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
17080 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
17090 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
170a0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
170b0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
170c0 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
170d0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
170e0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
170f0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
17100 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
17110 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
17120 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
17130 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
17140 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17150 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
17160 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
17170 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
17180 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
17190 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
171a0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
171b0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
171c0 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
171d0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
171e0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
171f0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
17200 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
17210 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
17220 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
17230 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
17240 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
17250 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
17260 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
17270 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
17280 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
17290 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
172a0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
172b0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
172c0 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
172d0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
172e0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
172f0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
17300 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
17310 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
17320 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
17330 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
17340 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17350 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
17360 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
17370 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17380 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
17390 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
173a0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
173b0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
173c0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
173d0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
173e0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
173f0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
17400 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
17410 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
17420 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
17430 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
17440 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
17450 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
17460 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
17470 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17480 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17490 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
174a0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
174b0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
174c0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
174d0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
174e0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
174f0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
17500 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
17510 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
17520 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
17530 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
17540 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
17550 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17560 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17570 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
17580 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
17590 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
175a0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
175b0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
175c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
175d0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
175e0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
175f0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
17600 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
17610 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
17620 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17630 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
17640 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
17650 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
17660 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
17670 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
17680 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17690 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
176a0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
176b0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
176c0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
176d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
176e0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
176f0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
17700 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
17710 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
17720 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
17730 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
17740 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
17750 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
17760 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17770 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17780 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
17790 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
177a0 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
177b0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
177c0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
177d0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
177e0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
177f0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
17800 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
17810 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
17820 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
17830 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
17840 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
17850 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
17860 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
17870 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
17880 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
17890 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
178a0 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
178b0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
178c0 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
178d0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
178e0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
178f0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
17900 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
17910 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
17920 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
17930 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
17940 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
17950 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
17960 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
17970 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
17980 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
17990 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
179a0 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
179b0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
179c0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
179d0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
179e0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
179f0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
17a00 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
17a10 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
17a20 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
17a30 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
17a40 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
17a50 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
17a60 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
17a70 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
17a80 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
17a90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
17aa0 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
17ab0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
17ac0 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
17ad0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
17ae0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
17af0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
17b00 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
17b10 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
17b20 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
17b30 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
17b40 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17b50 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
17b60 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
17b70 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
17b80 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
17b90 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
17ba0 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
17bb0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
17bc0 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
17bd0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
17be0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
17bf0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
17c00 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
17c10 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
17c20 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
17c30 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
17c40 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
17c50 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
17c60 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
17c70 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
17c80 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
17c90 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
17ca0 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
17cb0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
17cc0 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
17cd0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
17ce0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
17cf0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
17d00 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
17d10 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
17d20 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
17d30 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
17d40 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
17d50 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
17d60 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
17d70 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
17d80 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
17d90 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
17da0 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
17db0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
17dc0 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
17dd0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
17de0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
17df0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
17e00 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
17e10 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
17e20 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
17e30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17e40 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
17e50 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
17e60 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
17e70 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
17e80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17e90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
17ea0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ec0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
17ed0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
17ee0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
17ef0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
17f00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
17f10 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
17f20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
17f30 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
17f40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
17f50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
17f60 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
17f70 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
17f80 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
17f90 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
17fa0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17fb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17fc0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
17fd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17fe0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
17ff0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
18000 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
18010 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
18020 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
18030 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
18040 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
18050 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
18060 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18070 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
18080 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18090 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
180a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
180b0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
180c0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
180d0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
180e0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
180f0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18100 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
18110 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
18120 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
18130 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18140 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
18150 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
18160 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18170 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18180 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
18190 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
181a0 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
181b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
181c0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
181d0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
181e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
181f0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
18200 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18210 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
18220 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18230 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
18240 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18250 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18260 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18270 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
18280 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18290 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
182a0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
182b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
182c0 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
182d0 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
182e0 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
182f0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
18300 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
18310 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18320 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
18330 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18340 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18350 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
18360 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18370 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
18380 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
18390 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
183a0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
183b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
183c0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
183d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
183e0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
183f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18400 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
18410 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
18420 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
18430 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
18440 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
18450 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18460 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18470 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
18480 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
18490 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
184a0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
184b0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
184c0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
184d0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
184e0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
184f0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
18500 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
18510 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
18520 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
18530 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
18540 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18550 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
18560 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
18570 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
18580 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
18590 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
185a0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
185b0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
185c0 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
185d0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
185e0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
185f0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
18600 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
18610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
18620 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
18630 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
18640 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
18650 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18660 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
18670 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
18680 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
18690 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
186a0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
186b0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
186c0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
186d0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
186e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
18700 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18710 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
18720 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
18730 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18740 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
18750 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
18760 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18770 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
18780 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18790 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
187a0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
187b0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
187c0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
187d0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
187e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
187f0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
18800 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
18810 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
18820 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
18830 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
18840 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
18850 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
18860 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
18870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
18880 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
18890 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
188a0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
188b0 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
188c0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
188d0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
188e0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
188f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
18900 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
18910 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
18920 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
18930 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
18940 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
18950 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18960 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18970 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
18980 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18990 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
189a0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
189b0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
189c0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
189d0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
189e0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
189f0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
18a00 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
18a10 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
18a20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
18a30 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
18a40 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
18a50 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
18a60 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
18a70 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
18a80 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
18a90 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
18aa0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
18ab0 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
18ac0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
18ad0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
18ae0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
18af0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
18b00 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
18b10 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
18b20 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
18b30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
18b40 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
18b50 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
18b60 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18b70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18b80 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
18b90 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18ba0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
18bb0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
18bc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18bd0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18be0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
18bf0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
18c00 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
18c10 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
18c20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
18c30 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
18c40 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
18c50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
18c60 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
18c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
18c80 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
18c90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18ca0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18cb0 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18cc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18cd0 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18ce0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18cf0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18d00 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18d10 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18d20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18d30 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18d40 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18d50 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18d60 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18d70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18d80 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18d90 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18da0 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18db0 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18dc0 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18dd0 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18de0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18df0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18e00 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18e10 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18e20 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18e30 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18e40 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18e50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18e60 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18e70 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18e80 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
18e90 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
18ea0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
18eb0 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
18ec0 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
18ed0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
18ee0 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
18ef0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
18f00 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
18f10 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18f20 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18f30 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18f40 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
18f50 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
18f60 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
18f70 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
18f80 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18f90 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18fa0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
18fc0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18fd0 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
18fe0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
18ff0 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
19000 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
19010 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
19020 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
19030 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
19040 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
19050 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
19060 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
19070 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
19080 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
19090 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
190a0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
190b0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
190c0 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
190d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
190e0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
190f0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
19100 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
19110 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
19120 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
19130 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
19140 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
19150 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
19160 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
19170 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
19180 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
19190 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
191a0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
191b0 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
191c0 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
191d0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
191e0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
191f0 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
19200 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
19210 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
19220 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
19230 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
19240 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19250 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
19260 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
19270 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
19280 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
19290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
192a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
192b0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
192c0 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
192d0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
192e0 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
192f0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
19300 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
19310 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
19320 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
19330 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
19340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
19350 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
19360 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
19370 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
19380 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
19390 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
193a0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
193b0 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
193c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
193d0 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
193e0 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
193f0 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
19400 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
19410 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
19420 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
19430 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
19440 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
19450 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
19460 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
19470 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
19480 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
19490 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
194a0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
194b0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
194c0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
194d0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
194e0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
194f0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
19500 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
19510 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
19520 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
19530 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
19540 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
19550 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
19560 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
19570 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
19580 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
19590 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
195a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
195b0 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
195c0 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
195d0 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19600 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
19610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19620 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
19630 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
19640 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
19650 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
19660 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
19670 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19680 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
19690 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
196a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
196b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
196c0 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
196d0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
196e0 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
196f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
19700 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
19710 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
19720 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19730 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
19740 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
19750 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19760 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
19770 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
19780 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
19790 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
197a0 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
197b0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
197c0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
197d0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
197e0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
197f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
19800 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
19810 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
19820 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
19830 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
19840 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
19850 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19860 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
19870 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
19880 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19890 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
198a0 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
198b0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
198c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
198d0 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
198e0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
198f0 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
19900 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
19910 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
19920 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
19930 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19940 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
19950 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
19960 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19970 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
19980 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
19990 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
199a0 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
199b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
199c0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
199d0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
199e0 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
199f0 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
19a00 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
19a10 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
19a20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19a30 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
19a40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
19a50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19a60 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19a70 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19a80 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19a90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19aa0 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
19ab0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
19ac0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
19ad0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
19ae0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
19af0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
19b00 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19b10 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19b20 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19b30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19b40 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19b50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19b60 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19b70 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19b80 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19b90 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19bb0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19bc0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19bd0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19be0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19bf0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19c00 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19c10 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19c20 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19c30 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19c40 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19c50 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19c60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19c70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19c80 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19c90 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19ca0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19cb0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19cc0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19cd0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19d00 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19d10 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19d20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19d30 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19d40 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19d50 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19d60 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19d70 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19d80 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19d90 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19da0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19db0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19dc0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19dd0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19de0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19df0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19e00 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19e10 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19e20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19e30 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19e40 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19e50 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19e60 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19e70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19e80 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19e90 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19ea0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19eb0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19ec0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19ed0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19ee0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19ef0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19f00 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19f10 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19f20 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19f30 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19f40 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19f50 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19f60 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19f70 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19f80 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19f90 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19fa0 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19fc0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19fd0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19fe0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19ff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a000 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a010 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
1a020 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
1a050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a060 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1a070 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  (v, addrEofA);. 
1a080 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
1a090 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
1a0a0 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
1a0b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1a0c0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1a0d0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1a0e0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
1a0f0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1a100 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1a110 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
1a120 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1a130 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1a140 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
1a150 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
1a160 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
1a170 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
1a180 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
1a190 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
1a1a0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
1a1b0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1a1c0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a1d0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
1a1e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1a1f0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
1a200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a210 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1a220 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
1a230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a240 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a250 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
1a260 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a270 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a280 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42  Goto(v, addrEofB
1a290 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a2a0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a2b0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a2c0 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
1a2d0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a2e0 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
1a2f0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
1a300 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a310 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a320 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a330 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
1a340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a350 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a360 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a370 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a380 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a390 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1a3a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a3b0 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1a3c0 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
1a3d0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1a3e0 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
1a3f0 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1a400 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1a410 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1a420 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1a430 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
1a440 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
1a450 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1a460 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
1a470 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a480 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
1a490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a4a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a4b0 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1a4c0 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1a4d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1a4e0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1a4f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
1a500 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a510 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1a520 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
1a530 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1a540 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
1a550 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a560 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
1a570 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1a580 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
1a590 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1a5a0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1a5b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a5c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a5d0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1a5e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a5f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a600 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a610 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a620 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a630 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a640 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  v, labelCmpr);..
1a650 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
1a660 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
1a670 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
1a680 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
1a690 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1a6a0 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
1a6b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a6c0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a6d0 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  rA, addrEofA_noB
1a6e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a6f0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a700 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a710 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a720 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a730 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
1a740 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d   Implement the m
1a750 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20  ain merge loop. 
1a760 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a770 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a780 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73   labelCmpr);.  s
1a790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a7a0 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  (v, OP_Permutati
1a7b0 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  on, 0, 0, 0, (ch
1a7c0 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34  ar*)aPermute, P4
1a7d0 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71  _INTARRAY);.  sq
1a7e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a7f0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64  v, OP_Compare, d
1a800 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74  estA.iSdst, dest
1a810 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42  B.iSdst, nOrderB
1a820 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1a830 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a840 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
1a850 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
1a860 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1a870 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55  (v, OPFLAG_PERMU
1a880 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TE);.  sqlite3Vd
1a890 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
1a8a0 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61  ump, addrAltB, a
1a8b0 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74  ddrAeqB, addrAgt
1a8c0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a8d0 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  (v);..  /* Jump 
1a8e0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
1a8f0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
1a900 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
1a910 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
1a920 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a930 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
1a940 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
1a950 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
1a960 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
1a970 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1a980 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
1a990 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
1a9a0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
1a9b0 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
1a9c0 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
1a9d0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
1a9e0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
1a9f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1aa00 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
1aa10 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
1aa20 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
1aa30 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
1aa40 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
1aa50 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
1aa60 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
1aa70 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
1aa80 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
1aa90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
1aaa0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
1aab0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
1aac0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1aad0 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e  or;.  pPrior->pN
1aae0 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a  ext = p;..  /***
1aaf0 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
1ab00 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
1ab10 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
1ab20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
1ab30 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
1ab40 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
1ab50 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
1ab60 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
1ab70 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
1ab80 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1ab90 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1aba0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1abb0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1abc0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1abd0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1abe0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1abf0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1ac00 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1ac10 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
1ac20 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
1ac30 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1ac40 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1ac50 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
1ac60 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
1ac70 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ist*, int);../*.
1ac80 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1ac90 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1aca0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1acb0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1acc0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1acd0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1ace0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1acf0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1ad00 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1ad10 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1ad20 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1ad30 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1ad40 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1ad50 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1ad60 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1ad70 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1ad80 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1ad90 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1ada0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1adb0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1adc0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1add0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1ade0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1adf0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1ae00 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1ae10 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1ae20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1ae30 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1ae40 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
1ae50 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1ae60 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1ae70 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1ae80 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1ae90 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1aea0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1aeb0 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1aec0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1aed0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1aee0 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1aef0 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
1af00 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1af10 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1af20 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
1af30 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1af40 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
1af50 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1af60 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1af70 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
1af80 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
1af90 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1afa0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1afb0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1afc0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1afd0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
1afe0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1aff0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b000 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1b010 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1b020 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
1b030 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1b040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1b050 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1b060 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1b070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1b080 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
1b090 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
1b0a0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1b0b0 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
1b0c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b0d0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1b0e0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1b0f0 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
1b100 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1b110 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
1b120 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1b130 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
1b140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1b150 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1b160 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
1b170 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
1b180 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
1b190 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1b1a0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
1b1b0 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
1b1c0 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
1b1d0 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
1b1e0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
1b1f0 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
1b200 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
1b210 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b220 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1b230 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1b240 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
1b250 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
1b260 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31  Table, pEList, 1
1b270 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b280 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1b290 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b2a0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b2b0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1b2c0 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1b2d0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1b2e0 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1b2f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b300 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1b310 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1b320 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1b330 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1b340 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1b350 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1b360 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1b370 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1b380 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1b390 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1b3a0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1b3b0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1b3c0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1b3d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b3e0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1b3f0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1b400 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1b410 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1b420 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1b430 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b440 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1b450 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b460 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
1b470 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1b480 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1b490 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1b4a0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1b4b0 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
1b4c0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b4d0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1b4e0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1b4f0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1b500 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
1b510 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b520 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
1b530 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
1b540 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
1b550 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1b560 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  lues */.  int do
1b570 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 2f  Prior          /
1b580 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1b590 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1b5a0 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1b5b0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1b5c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1b5d0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1b5e0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1b5f0 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    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 45 4c 69 73 74 2c 20 69 54 61 62 6c 65  ->pEList, iTable
1b620 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , 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 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b650 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b660 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b670 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
1b680 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b690 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1b6a0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1b6b0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
1b6c0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b6d0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1b6e0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b6f0 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
1b700 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 53 72  pEList);.    pSr
1b710 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
1b720 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1b730 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   );.    for(i=pS
1b740 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
1b750 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
1b760 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1b770 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
1b780 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1b790 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b7a0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1b7b0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1b7c0 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
1b7d0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b7e0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1b7f0 63 41 72 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  cArg, iTable, pE
1b800 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
1b810 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1b820 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1b830 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1b840 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1b850 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b860 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b870 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b880 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1b890 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b8a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1b8b0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1b8c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1b8d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b8e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1b8f0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1b900 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1b910 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1b920 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1b930 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1b940 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1b950 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1b960 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1b970 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1b980 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1b990 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1b9a0 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1b9b0 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1b9c0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1b9d0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1b9e0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1b9f0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ba00 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1ba10 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ba20 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1ba30 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1ba40 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1ba50 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1ba60 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1ba70 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1ba80 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1ba90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1baa0 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1bab0 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1bac0 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1bad0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1bae0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1baf0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1bb00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1bb10 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1bb20 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1bb30 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1bb40 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1bb50 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1bb60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bb70 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1bb80 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1bb90 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1bba0 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1bbb0 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1bbc0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1bbd0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1bbe0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1bbf0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1bc00 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1bc10 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1bc20 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1bc30 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1bc40 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1bc50 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1bc60 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1bc70 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1bc80 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1bc90 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1bca0 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1bcb0 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1bcc0 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1bcd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1bce0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1bcf0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1bd00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1bd10 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1bd20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1bd30 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1bd40 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1bd50 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1bd60 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1bd70 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1bd80 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1bd90 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75 74   or (2a) the out
1bda0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1bdb0 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  a join.**       
1bdc0 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f 75   and (2b) the ou
1bdd0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1bde0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1bdf0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1be00 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 46   one.**        F
1be10 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1be20 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63 61  ery that is a ca
1be30 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61 74  ndidate for flat
1be40 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73 0a  tening.  (2b is.
1be50 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74 6f  **        due to
1be60 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1be70 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f 6d  73bf9abf80] from
1be80 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1be90 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1bea0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1beb0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1bec0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1bed0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1bee0 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1bef0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1bf00 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1bf10 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1bf20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1bf30 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1bf40 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1bf50 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1bf60 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1bf70 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1bf80 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1bf90 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1bfa0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1bfb0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1bfc0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1bfd0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1bfe0 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1bff0 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1c000 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1c010 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1c020 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1c030 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1c040 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c050 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1c060 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c070 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1c080 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1c090 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1c0a0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1c0b0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1c0c0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1c0d0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1c0e0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1c0f0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1c100 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1c110 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1c120 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1c130 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1c140 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1c150 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1c160 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1c170 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1c180 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  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 69 73 20 6e  outer query is n
1c1c0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1c1d0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1c1e0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c1f0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1c200 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1c210 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c220 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1c230 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1c240 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1c250 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1c260 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1c270 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1c280 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1c290 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1c2a0 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1c2b0 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1c2c0 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1c2d0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1c2e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1c2f0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1c300 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c310 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73   .**        does
1c320 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1c330 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1c340 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1c350 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1c360 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
1c370 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
1c380 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
1c390 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
1c3a0 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
1c3b0 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
1c3c0 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
1c3d0 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
1c3e0 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
1c3f0 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
1c400 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
1c410 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
1c420 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
1c430 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1c440 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
1c450 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
1c460 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c470 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
1c480 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
1c490 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c4a0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1c4b0 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
1c4c0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1c4d0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
1c4e0 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
1c4f0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1c500 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1c510 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1c520 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1c530 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
1c540 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1c550 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1c560 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
1c570 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
1c580 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
1c590 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
1c5a0 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
1c5b0 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
1c5c0 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
1c5d0 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
1c5e0 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
1c5f0 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
1c600 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
1c610 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
1c620 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
1c630 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
1c640 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1c650 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
1c660 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
1c670 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1c680 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
1c690 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
1c6a0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
1c6b0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
1c6c0 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
1c6d0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
1c6e0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1c6f0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1c700 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
1c710 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
1c720 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
1c730 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
1c740 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
1c750 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
1c760 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
1c770 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
1c780 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
1c790 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
1c7a0 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
1c7b0 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
1c7c0 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
1c7d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1c7e0 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
1c7f0 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
1c800 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
1c810 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1c820 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
1c830 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
1c840 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
1c850 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1c860 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
1c870 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
1c880 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
1c890 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
1c8a0 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
1c8b0 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
1c8c0 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
1c8d0 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
1c8e0 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
1c8f0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
1c900 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
1c910 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
1c920 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
1c930 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
1c940 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
1c950 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
1c960 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
1c970 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
1c980 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
1c990 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
1c9a0 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
1c9b0 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
1c9c0 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
1c9d0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
1c9e0 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
1c9f0 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
1ca00 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
1ca10 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
1ca20 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
1ca30 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1ca40 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1ca50 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
1ca60 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
1ca70 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
1ca80 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
1ca90 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
1caa0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
1cab0 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
1cac0 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1cad0 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
1cae0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1caf0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1cb00 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1cb10 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1cb20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
1cb30 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
1cb40 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
1cb50 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1cb60 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1cb70 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
1cb80 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
1cb90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cba0 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
1cbb0 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
1cbc0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1cbd0 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
1cbe0 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
1cbf0 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
1cc00 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1cc10 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
1cc20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
1cc30 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
1cc40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
1cc50 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
1cc60 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
1cc70 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
1cc80 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
1cc90 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
1cca0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
1ccb0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1ccc0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1ccd0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1cce0 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1ccf0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1cd00 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
1cd10 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
1cd20 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75  **  (22)  The su
1cd30 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
1cd40 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1cd50 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20  *.**  (23)  The 
1cd60 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  parent is not a 
1cd70 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f  recursive CTE, o
1cd80 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  r the sub-query 
1cd90 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20  is not a.**     
1cda0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72     compound quer
1cdb0 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74  y. This restrict
1cdc0 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74  ion is because t
1cdd0 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a  ransforming the.
1cde0 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  **        parent
1cdf0 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   to a compound q
1ce00 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68  uery confuses th
1ce10 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64  e code that hand
1ce20 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  les.**        re
1ce30 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20  cursive queries 
1ce40 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  in multiSelect()
1ce50 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54  ..**.**  (24)  T
1ce60 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1ce70 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1ce80 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1ce90 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1cea0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1ceb0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1cec0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1ced0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1cee0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1cef0 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1cf00 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1cf10 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1cf20 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1cf30 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1cf40 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1cf50 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1cf60 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1cf70 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1cf80 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1cf90 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1cfa0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1cfb0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1cfc0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1cfd0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1cfe0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1cff0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1d000 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1d010 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1d020 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1d030 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d040 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1d050 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1d060 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1d070 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1d080 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1d090 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1d0a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1d0b0 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1d0c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1d0d0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1d0e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1d0f0 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1d100 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1d110 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1d120 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1d130 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1d140 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1d150 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1d160 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1d170 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1d180 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1d190 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1d1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d1b0 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1d1c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d1d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1d1e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1d1f0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1d200 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1d210 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1d220 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1d230 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d240 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1d250 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1d260 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1d270 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1d280 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1d290 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1d2a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1d2b0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1d2c0 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1d2d0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1d2e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1d2f0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1d300 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  ;    /* Current 
1d310 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f  UNION ALL term o
1d320 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72  f the other quer
1d330 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  y */.  Select *p
1d340 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1d350 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1d360 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1d370 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1d380 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d390 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1d3a0 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1d3b0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1d3c0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1d3d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1d3e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1d3f0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d400 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1d410 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d420 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d430 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d440 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1d450 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1d460 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d470 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1d480 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1d490 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1d4a0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1d4b0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1d4c0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d4d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d4e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1d4f0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d510 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d520 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d530 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1d540 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1d550 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1d560 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d570 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1d580 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1d590 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d5a0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1d5b0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1d5c0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1d5d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1d5e0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1d5f0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1d600 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1d610 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1d620 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1d630 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1d640 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1d650 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1d660 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d670 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1d680 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1d690 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1d6a0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1d6b0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1d6c0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1d6d0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1d6e0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1d6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d700 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62  !=0 );.  if( sub
1d710 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d720 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65    if( isAgg ) re
1d730 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d760 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20  ction (1)   */. 
1d770 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
1d780 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d7b0 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a  iction (2a)  */.
1d7c0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65      if( (p->pWhe
1d7d0 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  re && ExprHasPro
1d7e0 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c  perty(p->pWhere,
1d7f0 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20  EP_Subquery)).  
1d800 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1d810 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1d820 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71  EList) & EP_Subq
1d830 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c  uery)!=0.     ||
1d840 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1d850 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72  tFlags(p->pOrder
1d860 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  By) & EP_Subquer
1d870 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)!=0.    ){.   
1d880 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d8c0 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20  tion (2b)  */.  
1d8d0 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70    }.  }.    .  p
1d8e0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d8f0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d900 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
1d910 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
1d920 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
1d930 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
1d940 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
1d950 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
1d960 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
1d970 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
1d980 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1d990 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1d9a0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d9b0 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1d9c0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1d9d0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1d9e0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1d9f0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1da00 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1da10 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1da20 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1da30 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1da40 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1da50 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1da60 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1da70 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da90 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1daa0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1dab0 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1dac0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dae0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1daf0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1db00 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1db10 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1db20 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1db30 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1db70 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1db80 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1db90 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1dba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dbc0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1dbd0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1dbe0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1dbf0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1dc00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dc10 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1dc20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1dc30 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1dc40 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1dc50 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1dc60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dc70 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1dc80 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1dc90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1dca0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1dcb0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1dcc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1dcd0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dce0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1dcf0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1dd00 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1dd10 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1dd20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dd60 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1dd70 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1dd80 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1dd90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dda0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ddb0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1ddc0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1ddd0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1dde0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ddf0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1de00 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1de10 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1de20 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1de30 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1de40 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1de50 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1de60 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1de70 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
1de80 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1de90 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1dea0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1deb0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1dec0 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
1ded0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1dee0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1def0 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67  sive|SF_MinMaxAg
1df00 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1df10 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1df20 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34  ons (22) and (24
1df30 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1df40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1df50 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
1df60 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1df70 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1df80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  Restriction (23)
1df90 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
1dfa0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1dfb0 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1dfc0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1dfd0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1dfe0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1dff0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1e000 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1e010 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e020 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1e030 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1e040 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1e050 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1e060 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1e070 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e080 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1e090 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1e0a0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1e0b0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1e0c0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e0d0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1e0e0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1e0f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1e100 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1e110 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1e120 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1e130 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1e140 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1e150 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1e160 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1e170 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1e180 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1e190 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1e1a0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1e1b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1e1c0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1e1d0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1e1e0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1e1f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1e200 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e210 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1e220 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1e230 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e240 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e250 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e260 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e270 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e280 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1e290 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1e2a0 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1e2b0 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1e2c0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1e2d0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1e2e0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1e2f0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1e300 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1e310 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1e320 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1e330 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1e340 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1e350 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1e360 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1e370 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1e380 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e390 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1e3a0 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1e3b0 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1e3c0 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1e3d0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1e3e0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e3f0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1e400 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e410 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1e420 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1e430 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66  if( (pSubitem->f
1e440 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
1e450 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
1e460 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1e470 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e480 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1e490 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e4a0 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1e4b0 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1e4c0 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1e4d0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1e4e0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1e4f0 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1e500 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1e510 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1e520 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1e530 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1e540 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1e550 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1e560 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1e570 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e580 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1e590 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1e5a0 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1e5b0 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1e5c0 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1e5d0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1e5e0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1e5f0 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1e600 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1e610 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e620 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1e630 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1e640 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1e650 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1e660 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1e670 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e680 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e690 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1e6a0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e6b0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e6c0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e6d0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1e6e0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1e6f0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1e700 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1e710 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e720 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
1e730 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1e740 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
1e750 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e760 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e770 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1e780 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1e790 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1e7a0 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1e7b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1e7c0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1e7d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1e7e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1e7f0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
1e800 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
1e810 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
1e820 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
1e830 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
1e840 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
1e850 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
1e860 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1e870 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
1e880 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1e890 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1e8a0 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78  derBy->a[ii].u.x
1e8b0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
1e8c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e8d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e8e0 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
1e8f0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1e900 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1e910 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
1e920 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
1e930 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74  pParse,p,("flatt
1e940 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65  en %s.%p from te
1e950 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rm %d\n",.      
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75               pSu
1e970 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75  b->zSelName, pSu
1e980 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f  b, iFrom));..  /
1e990 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1e9a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1e9b0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1e9c0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1e9d0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1e9e0 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1e9f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1ea00 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1ea10 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1ea20 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1ea30 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1ea40 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1ea50 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1ea60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1ea70 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1ea80 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1ea90 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1eaa0 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1eab0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1eac0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1ead0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1eae0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1eaf0 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1eb00 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1eb10 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1eb20 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1eb30 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1eb40 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1eb50 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1eb60 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1eb70 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1eb80 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1eb90 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1eba0 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1ebb0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1ebc0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1ebd0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ebe0 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1ebf0 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1ec00 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1ec10 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1ec20 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1ec30 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1ec40 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1ec50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1ec60 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ec70 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1ec80 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1ec90 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1eca0 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1ecb0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1ecc0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1ecd0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1ece0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ecf0 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1ed00 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ed10 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1ed20 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1ed30 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1ed40 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1ed50 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1ed60 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1ed70 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1ed80 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1ed90 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1eda0 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1edb0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1edc0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1edd0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1ede0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1edf0 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1ee00 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1ee10 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1ee20 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ee30 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1ee40 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1ee50 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1ee60 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1ee70 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1ee80 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1ee90 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1eea0 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1eeb0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1eec0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1eed0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1eee0 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1eef0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1ef00 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1ef10 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1ef20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1ef30 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1ef40 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1ef50 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1ef60 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1ef70 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1ef80 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1ef90 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1efa0 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1efb0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1efc0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1efd0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1efe0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1eff0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1f000 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
1f010 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
1f020 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
1f030 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  e);.    p->pOffs
1f040 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1f050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1f060 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1f070 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1f080 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1f090 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1f0a0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
1f0b0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1f0c0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1f0d0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
1f0e0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
1f0f0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1f100 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
1f110 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
1f120 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
1f130 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
1f140 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1f150 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
1f160 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
1f170 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
1f180 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f190 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
1f1a0 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
1f1b0 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
1f1c0 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
1f1d0 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
1f1e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f1f0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1f200 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1f210 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1f220 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1f230 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1f240 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1f250 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1f260 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1f270 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1f280 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1f290 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1f2a0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1f2b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1f2c0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1f2d0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1f2e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f2f0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1f300 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f310 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f320 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1f330 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f340 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1f350 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f360 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1f370 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1f380 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1f390 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1f3a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1f3b0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1f3c0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1f3d0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1f3e0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1f3f0 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1f400 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1f410 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1f420 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1f430 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1f440 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1f450 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1f460 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1f470 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1f480 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1f490 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1f4a0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1f4b0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1f4c0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1f4d0 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1f4e0 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1f4f0 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1f500 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1f510 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1f520 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1f530 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1f540 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1f550 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1f560 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1f570 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1f580 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1f590 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1f5a0 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1f5b0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f5c0 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1f5d0 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1f5e0 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1f5f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1f600 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1f610 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1f620 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1f630 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1f640 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1f650 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1f660 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1f670 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1f680 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1f690 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1f6a0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1f6b0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1f6c0 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1f6d0 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1f6e0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1f6f0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1f700 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1f710 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1f720 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1f730 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1f740 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1f750 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1f760 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1f770 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1f780 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1f790 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f7a0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1f7b0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1f7c0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1f7d0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1f7e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1f7f0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1f800 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1f810 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1f820 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1f830 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1f840 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1f850 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1f860 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1f870 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1f880 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1f890 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1f8a0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1f8b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1f8c0 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1f8d0 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1f8e0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1f8f0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1f900 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1f910 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1f920 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1f930 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1f940 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1f950 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1f960 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1f970 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1f980 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1f990 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1f9a0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1f9b0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1f9c0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1f9d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1f9e0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1f9f0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1fa00 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1fa10 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1fa20 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fa30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1fa40 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1fa50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fa60 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1fa70 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1fa80 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fa90 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1faa0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a  = pSubitem->fg.j
1fab0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1fac0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1fad0 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1fae0 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1faf0 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1fb00 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1fb10 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1fb20 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1fb30 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1fb40 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1fb50 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1fb60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1fb70 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1fb80 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1fb90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1fba0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1fbb0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1fbc0 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1fbd0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1fbe0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1fbf0 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1fc00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1fc10 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1fc20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1fc30 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1fc40 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1fc50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1fc60 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1fc70 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1fc80 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1fc90 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1fca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1fcb0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1fcc0 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1fcd0 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1fce0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1fcf0 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1fd00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1fd10 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1fd20 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1fd30 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1fd40 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1fd50 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1fd60 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1fd70 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1fd80 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1fd90 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1fda0 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1fdb0 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
1fdc0 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
1fdd0 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
1fde0 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
1fdf0 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
1fe00 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
1fe10 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1fe20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
1fe30 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
1fe40 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1fe50 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1fe60 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1fe70 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1fe80 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1fe90 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
1fea0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1feb0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
1fec0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
1fed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1fee0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1fef0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ff00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ff10 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
1ff20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1ff30 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
1ff40 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1ff50 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1ff60 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
1ff70 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1ff80 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1ff90 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1ffa0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
1ffb0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
1ffc0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1ffd0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1ffe0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1fff0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
20000 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
20010 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
20020 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
20030 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69  >a[iFrom].fg.joi
20040 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
20050 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
20060 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
20070 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
20080 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
20090 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
200a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
200b0 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
200c0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
200d0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
200e0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
200f0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
20100 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
20110 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
20120 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
20130 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
20140 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
20150 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
20160 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
20170 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
20180 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
20190 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
201a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
201b0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
201c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
201d0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
201e0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
201f0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
20200 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
20210 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
20220 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
20230 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
20240 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
20250 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
20260 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
20270 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
20280 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
20290 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
202a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
202b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
202c0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
202d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
202e0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
202f0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
20300 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
20310 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
20320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20330 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
20340 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
20350 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
20360 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
20370 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
20380 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
20390 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
203a0 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
203b0 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
203c0 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
203d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
203e0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
203f0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
20400 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
20410 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
20420 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20430 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
20440 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
20450 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
20460 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
20470 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
20480 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
20490 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
204a0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
204b0 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
204c0 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
204d0 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
204e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
204f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20500 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
20510 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
20520 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
20530 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
20540 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
20550 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
20560 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
20570 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
20580 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
20590 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
205a0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
205b0 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
205c0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
205d0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
205e0 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
205f0 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
20600 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
20610 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
20620 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
20630 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
20640 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20650 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
20660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20670 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
20680 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
20690 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
206a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
206b0 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
206c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
206d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
206e0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
206f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
20700 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
20710 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
20720 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
20730 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
20740 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
20750 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ere, 0);.    if(
20760 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
20770 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20780 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
207a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
207b0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
207c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
207d0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
207e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
207f0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
20800 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
20810 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
20850 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
20860 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20870 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20880 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20890 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
208a0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
208b0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
208c0 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
208d0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
208e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
208f0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
20900 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
20910 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
20920 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75  e);.    }.    su
20930 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50  bstSelect(db, pP
20940 61 72 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20  arent, iParent, 
20950 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29  pSub->pEList, 0)
20960 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
20970 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
20980 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
20990 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
209a0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
209b0 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
209c0 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
209d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
209e0 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
209f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
20a00 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
20a10 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
20a20 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
20a30 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
20a40 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
20a50 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
20a60 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
20a70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
20a80 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
20a90 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
20aa0 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
20ab0 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
20ac0 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
20ad0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
20ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
20af0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
20b00 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
20b10 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
20b20 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
20b30 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
20b40 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
20b50 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
20b60 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
20b70 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
20b80 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
20b90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
20ba0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20bb0 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
20bc0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
20bd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
20be0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
20bf0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
20c00 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
20c10 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
20c20 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
20c30 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
20c40 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
20c50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20c60 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
20c70 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
20c80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20c90 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
20ca0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20cb0 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  W) */....#if !de
20cc0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20cd0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20ce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20cf0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
20d00 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
20d10 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
20d20 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
20d30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
20d40 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
20d50 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
20d60 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
20d70 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
20d80 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
20d90 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
20da0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
20db0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
20dc0 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
20dd0 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
20de0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20df0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
20e00 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
20e10 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
20e20 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
20e30 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
20e40 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
20e50 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
20e60 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
20e70 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
20e80 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
20e90 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
20ea0 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
20eb0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
20ec0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  .**.**   (1) The
20ed0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
20ee0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28  an aggregate.  (
20ef0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  In that case, we
20f00 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a  'd really want.*
20f10 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20  *       to copy 
20f20 74 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d  the outer WHERE-
20f30 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74  clause terms ont
20f40 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  o the HAVING cla
20f50 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  use of the.**   
20f60 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e      inner query.
20f70 20 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61    But they proba
20f80 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74  bly won't help t
20f90 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62  here so do not b
20fa0 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  other.).**.**   
20fb0 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (2) The inner qu
20fc0 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72  ery is the recur
20fd0 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63  sive part of a c
20fe0 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
20ff0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
21000 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (3) The inner qu
21010 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20  ery has a LIMIT 
21020 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68  clause (since th
21030 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
21040 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20   WHERE.**       
21050 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e  close would chan
21060 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ge the meaning o
21070 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a  f the LIMIT)..**
21080 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e  .**   (4) The in
21090 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
210a0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
210b0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
210c0 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20  (The caller.**  
210d0 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68       enforces th
210e0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  is restriction s
210f0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
21100 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
21110 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20  enough.**       
21120 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b  information to k
21130 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35  now.).**.**   (5
21140 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  ) The WHERE clau
21150 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
21160 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
21170 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
21180 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
21190 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a   LEFT JOIN..**.*
211a0 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
211b0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
211c0 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
211d0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
211e0 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
211f0 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
21200 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
21210 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
21220 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
21230 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65  eTerms(.  sqlite
21240 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
21250 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21260 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20  connection (for 
21270 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53  malloc()) */.  S
21280 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
21290 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
212a0 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
212b0 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
212c0 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
212d0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
212e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
212f0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
21300 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
21310 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20    int iCursor   
21320 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
21330 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
21340 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
21350 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
21360 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20  nt nChng = 0;.  
21370 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20  if( pWhere==0 ) 
21380 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21390 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73  (pSubq->selFlags
213a0 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65   & (SF_Aggregate
213b0 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21  |SF_Recursive))!
213c0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
213d0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
213e0 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29  ions (1) and (2)
213f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21400 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  ubq->pLimit!=0 )
21410 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21420 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
21430 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  (3) */.  }.  whi
21440 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
21450 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43  TK_AND ){.    nC
21460 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57  hng += pushDownW
21470 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53  hereTerms(db, pS
21480 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
21490 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20  ght, iCursor);. 
214a0 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65     pWhere = pWhe
214b0 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20  re->pLeft;.  }. 
214c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
214d0 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
214e0 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
214f0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
21500 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73  ion 5 */.  if( s
21510 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
21520 65 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  eConstant(pWhere
21530 2c 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  , iCursor) ){.  
21540 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77    nChng++;.    w
21550 68 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20  hile( pSubq ){. 
21560 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
21570 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
21580 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20  Where, 0);.     
21590 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70   pNew = substExp
215a0 72 28 64 62 2c 20 70 4e 65 77 2c 20 69 43 75 72  r(db, pNew, iCur
215b0 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69  sor, pSubq->pELi
215c0 73 74 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71  st);.      pSubq
215d0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
215e0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 53  e3ExprAnd(db, pS
215f0 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
21600 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20  w);.      pSubq 
21610 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
21620 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21630 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
21640 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
21650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21660 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21670 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
21680 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
21690 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
216a0 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
216b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
216c0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
216d0 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
216e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
216f0 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
21700 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
21710 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
21720 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
21730 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
21740 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
21750 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
21760 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
21770 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
21780 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
21790 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
217a0 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
217b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
217c0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
217d0 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
217e0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
217f0 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
21800 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
21810 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
21820 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
21830 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
21840 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
21850 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
21860 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
21870 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
21880 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
21890 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
218a0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
218b0 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
218c0 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
218d0 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
218e0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
218f0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
21900 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
21910 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
21920 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
21930 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
21940 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
21950 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
21960 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
21970 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
21980 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
21990 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
219a0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
219b0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
219c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
219d0 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
219e0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
219f0 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
21a00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
21a10 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
21a20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
21a30 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
21a40 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
21a50 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
21a60 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
21a70 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
21a80 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
21a90 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
21aa0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
21ab0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
21ac0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
21ad0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21ae0 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
21af0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
21b00 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21b10 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
21b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
21b30 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21b40 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
21b50 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
21b60 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
21b70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
21b80 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
21b90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
21ba0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
21bb0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
21bc0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
21bd0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
21be0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21bf0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
21c00 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
21c10 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
21c20 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
21c30 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
21c40 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
21c50 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
21c60 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
21c70 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
21c80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21c90 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
21ca0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
21cb0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
21cc0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
21cd0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
21ce0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
21cf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
21d00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
21d10 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
21d20 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
21d30 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
21d40 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
21d50 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
21d60 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
21d70 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
21d80 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
21d90 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
21da0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
21db0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
21dc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
21dd0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
21de0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
21df0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
21e00 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
21e10 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
21e20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
21e30 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
21e40 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
21e50 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
21e60 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
21e70 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
21e80 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
21e90 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
21ea0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
21eb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21ec0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
21ed0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
21ee0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
21ef0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
21f00 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
21f10 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
21f20 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
21f30 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
21f40 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
21f50 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
21f60 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
21f70 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
21f80 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
21f90 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
21fa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21fb0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
21fc0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
21fd0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
21fe0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
21ff0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22000 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
22010 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
22020 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
22030 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
22040 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
22050 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
22060 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
22070 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
22080 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
22090 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
220a0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
220b0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
220c0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
220d0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
220e0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
220f0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
22100 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
22110 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
22120 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
22130 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
22140 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
22150 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
22160 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
22170 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
22180 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
22190 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
221a0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
221b0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
221c0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
221d0 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
221e0 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
221f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22200 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
22210 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
22220 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
22230 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
22240 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
22250 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
22260 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
22270 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
22280 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
22290 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
222a0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
222b0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
222c0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
222d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
222e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
222f0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
22300 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
22310 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
22320 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
22330 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
22340 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22350 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
22360 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
22370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22380 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
22390 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
223a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
223b0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
223c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
223d0 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
223e0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
223f0 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
22400 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
22410 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
22420 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
22430 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
22440 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
22450 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
22460 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
22470 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
22480 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
22490 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
224a0 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
224b0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
224c0 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
224d0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
224e0 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
224f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
22500 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
22510 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
22520 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
22530 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
22540 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
22550 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
22560 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
22570 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
22580 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
22590 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
225a0 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
225b0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
225c0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
225d0 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
225e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
225f0 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
22600 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
22610 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
22620 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
22630 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
22640 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
22650 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
22660 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
22670 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
22680 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
22690 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
226a0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
226b0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
226c0 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
226d0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
226e0 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
226f0 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
22700 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
22710 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
22720 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
22730 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
22740 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
22750 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
22760 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
22770 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
22780 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
22790 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
227a0 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
227b0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
227c0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
227d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
227e0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
227f0 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
22800 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22810 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
22820 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
22830 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
22840 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
22850 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
22860 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
22870 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
22880 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
22890 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
228a0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
228b0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
228c0 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
228d0 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
228e0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
228f0 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
22900 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22910 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
22920 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
22930 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
22940 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
22950 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
22960 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
22970 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
22980 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
22990 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
229a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
229b0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
229c0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
229d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
229e0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
229f0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
22a00 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
22a10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
22a20 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
22a30 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
22a40 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
22a50 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
22a60 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
22a70 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
22a80 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
22a90 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
22aa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
22ab0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
22ac0 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
22ad0 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
22ae0 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
22af0 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
22b00 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
22b10 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
22b20 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
22b30 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
22b40 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
22b50 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
22b60 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
22b70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
22b80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
22b90 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
22ba0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
22bb0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
22bc0 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
22bd0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
22be0 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
22bf0 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
22c00 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
22c10 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
22c20 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
22c30 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
22c40 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65  Offset = 0;.  re
22c50 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22c60 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
22c70 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
22c80 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
22c90 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
22ca0 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
22cb0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
22cc0 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
22cd0 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
22ce0 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
22cf0 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
22d00 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
22d10 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
22d20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
22d30 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
22d40 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
22d50 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
22d60 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
22d70 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
22d80 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
22d90 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
22da0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
22db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
22dc0 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
22dd0 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
22de0 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
22df0 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
22e00 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
22e10 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
22e20 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
22e30 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
22e40 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
22e50 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e70 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
22e80 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
22e90 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
22ea0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
22eb0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
22ec0 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
22ed0 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
22ee0 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
22ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
22f00 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
22f10 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
22f20 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
22f30 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
22f40 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
22f50 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
22f60 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
22f70 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
22f80 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
22f90 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
22fa0 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
22fb0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
22fc0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
22fd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
22fe0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
22ff0 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
23000 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
23010 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
23020 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
23030 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
23040 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
23050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
23060 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
23070 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
23080 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
23090 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
230a0 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
230b0 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
230c0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
230d0 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
230e0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
230f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23100 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
23110 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
23120 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
23130 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
23140 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
23150 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
23160 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
23170 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
23180 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
23190 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
231a0 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
231b0 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
231c0 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
231d0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
231e0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
231f0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
23200 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
23210 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
23220 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
23230 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
23240 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
23250 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
23260 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
23270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
23280 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
23290 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
232a0 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
232b0 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
232c0 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
232d0 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
232e0 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
232f0 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
23300 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23310 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
23320 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
23330 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
23340 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
23350 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
23360 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
23370 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
23380 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
23390 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
233a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
233b0 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
233c0 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
233d0 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
233e0 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
233f0 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
23400 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
23410 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
23420 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
23430 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
23440 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
23450 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
23460 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
23470 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
23480 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
23490 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
234a0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
234b0 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
234c0 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
234d0 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
234e0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
234f0 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
23500 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
23510 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
23520 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
23530 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
23540 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
23550 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
23560 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
23570 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
23580 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
23590 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
235a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
235b0 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
235c0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
235d0 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
235e0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
235f0 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
23600 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
23610 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
23620 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
23630 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
23640 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
23650 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
23660 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
23670 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23680 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
23690 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
236a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
236b0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
236c0 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
236d0 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
236e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
236f0 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
23700 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
23710 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
23740 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
23750 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
23760 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
23770 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
23780 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
23790 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
237a0 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
237b0 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
237c0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
237d0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
237e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
237f0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
23800 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
23810 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
23820 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23830 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
23840 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
23850 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
23860 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
23870 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
23880 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
23890 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
238a0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
238b0 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
238c0 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
238d0 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
238e0 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
238f0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
23900 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
23910 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
23920 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
23930 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
23940 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
23950 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
23960 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
23970 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
23980 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
23990 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
239a0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
239b0 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
239c0 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
239d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
239e0 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
239f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23a00 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
23a10 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
23a20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
23a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23a40 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  OR;.    }..    a
23a50 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23a60 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
23a70 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23a80 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23a90 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23aa0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
23ab0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23ac0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23ad0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23ae0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
23af0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
23b00 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
23b10 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
23b20 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23b30 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
23b40 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
23b50 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
23b60 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
23b70 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23b80 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23b90 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
23ba0 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
23bb0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23bc0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
23bd0 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
23be0 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
23bf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23c10 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
23c20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
23c30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
23c40 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
23c50 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
23c60 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
23c70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
23c80 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
23c90 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
23ca0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
23cb0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
23cc0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
23cd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
23ce0 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
23cf0 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
23d00 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
23d10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
23d20 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
23d30 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
23d40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
23d50 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
23d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
23d70 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
23d80 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
23d90 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
23da0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
23db0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
23dc0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
23dd0 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
23de0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
23df0 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
23e00 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
23e10 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  em->fg.isRecursi
23e20 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
23e30 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
23e40 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
23e50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
23e60 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
23e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23e80 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
23e90 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
23ea0 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
23eb0 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
23ec0 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
23ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23ee0 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
23ef0 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
23f00 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
23f10 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
23f20 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
23f30 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
23f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23f50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23f60 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
23f70 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
23f80 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
23f90 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
23fa0 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
23fb0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
23fc0 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
23fd0 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
23fe0 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
23ff0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
24000 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24010 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
24020 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
24030 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
24040 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
24050 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 20 20  rior : pSel);.  
24060 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
24070 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
24080 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
24090 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
240a0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
240b0 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
240c0 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
240d0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
240e0 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
240f0 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
24100 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
24110 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
24120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24130 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24140 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
24150 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
24160 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
24170 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
24180 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
24190 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
241a0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
241b0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
241c0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
241d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
241e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
241f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
24200 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
24210 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
24220 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
24230 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24240 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
24250 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
24260 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
24270 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24280 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
24290 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
242a0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
242b0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
242c0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
242d0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
242e0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
242f0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
24300 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
24310 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
24320 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
24330 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
24340 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
24350 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
24360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
24370 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
24380 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24390 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
243a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
243b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
243c0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
243d0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
243e0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
243f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24400 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
24410 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
24420 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
24430 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
24440 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
24450 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
24460 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
24470 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24480 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
24490 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
244a0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
244b0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
244c0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
244d0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
244e0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
244f0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
24500 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
24510 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
24520 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
24530 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
24540 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
24550 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
24560 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
24570 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a  pParse;.  With *
24580 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
24590 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
245a0 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20  .  if( pWith!=0 
245b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
245c0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
245d0 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ith );.    pPars
245e0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
245f0 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a  ->pOuter;.  }.}.
24600 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
24610 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
24620 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
24630 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
24640 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
24650 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
24660 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24670 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
24680 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
24690 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
246a0 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
246b0 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
246c0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
246d0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
246e0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
246f0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
24700 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
24710 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
24720 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
24730 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
24740 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
24750 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
24760 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
24770 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
24780 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
24790 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
247a0 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
247b0 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
247c0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
247d0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
247e0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
247f0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
24800 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
24810 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
24820 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
24830 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
24840 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
24850 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
24860 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
24870 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24880 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
24890 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
248a0 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
248b0 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
248c0 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
248d0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
248e0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
248f0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
24900 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
24910 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
24920 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
24930 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
24940 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
24950 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
24960 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
24970 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
24980 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
24990 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
249a0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
249b0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
249c0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
249d0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
249e0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
249f0 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
24a00 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
24a10 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
24a20 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
24a30 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
24a40 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
24a50 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
24a60 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
24a70 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
24a80 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
24a90 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24aa0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
24ab0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
24ac0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
24ad0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
24ae0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
24af0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
24b00 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
24b10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24b20 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
24b30 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24b40 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
24b50 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
24b60 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
24b70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
24b80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
24b90 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
24ba0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24bb0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
24bc0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
24bd0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
24be0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
24bf0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
24c00 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
24c10 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
24c20 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
24c30 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
24c40 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
24c50 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  ;.  if( pWalker-
24c60 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  >xSelectCallback
24c70 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69 74 68  2==selectPopWith
24c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   ){.    sqlite3W
24c90 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
24ca0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
24cb0 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d  ->pWith, 0);.  }
24cc0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
24cd0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
24ce0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
24cf0 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
24d00 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
24d10 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
24d20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d30 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
24d40 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
24d50 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
24d60 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
24d70 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
24d80 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
24d90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
24da0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
24db0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
24dc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24dd0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
24de0 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
24df0 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
24e00 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
24e10 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
24e20 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
24e30 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
24e40 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
24e50 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
24e60 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
24e70 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
24e80 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
24e90 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
24ea0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
24eb0 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46  cursive==0 || pF
24ec0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a  rom->pTab!=0 );.
24ed0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66      if( pFrom->f
24ee0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  g.isRecursive ) 
24ef0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
24f00 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
24f10 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==0 );.#ifndef 
24f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24f30 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
24f40 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
24f50 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
24f60 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
24f70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
24f80 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
24f90 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
24fa0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
24fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
24fc0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
24fd0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
24fe0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
24ff0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
25000 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25010 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
25020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
25030 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
25040 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25050 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab==0 );.      i
25060 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  f( sqlite3WalkSe
25070 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
25080 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  el) ) return WRC
25090 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 46  _Abort;.      pF
250a0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
250b0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
250c0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
250d0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
250e0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
250f0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25100 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
25110 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
25120 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
25130 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
25140 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
25150 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
25160 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
25170 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
25180 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
25190 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
251a0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
251b0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
251c0 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
251d0 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
251e0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
251f0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
25200 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
25210 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
25220 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
25230 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
25240 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
25250 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
25260 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
25270 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
25280 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
25290 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
252a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
252b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
252c0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
252d0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
252e0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
252f0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
25300 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
25310 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
25320 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
25330 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25340 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
25350 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
25360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25370 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
25380 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
25390 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
253a0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
253b0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
253c0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
253d0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
253e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
253f0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
25400 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
25410 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
25420 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
25430 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
25440 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25450 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
25460 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
25470 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
25480 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  b) ){.        i1
25490 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
254a0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
254b0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
254c0 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
254d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
254e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
254f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
25500 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
25510 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62   pFrom->fg.isTab
25520 46 75 6e 63 20 26 26 20 21 49 73 56 69 72 74 75  Func && !IsVirtu
25530 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
25540 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25550 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
25560 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
25570 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ction", pTab->zN
25580 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25590 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
255a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
255b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
255c0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
255d0 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
255e0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
255f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25600 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d  ctSetName(pFrom-
25610 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e  >pSelect, pTab->
25620 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
25630 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  nCol = pTab->nCo
25640 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  l;.        pTab-
25650 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  >nCol = -1;.    
25660 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25670 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
25680 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
25690 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
256a0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
256b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
256c0 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
256d0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
256e0 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
256f0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
25700 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
25710 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
25720 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
25730 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
25740 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25750 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
25760 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
25770 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
25780 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
25790 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
257a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
257b0 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
257c0 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
257d0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
257e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
257f0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
25800 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
25810 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
25820 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
25830 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
25840 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
25850 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
25860 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
25870 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
25880 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
25890 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
258a0 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
258b0 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
258c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
258d0 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45  with the TK_ASTE
258e0 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f  RISK operator fo
258f0 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
25900 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
25910 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74  column.  ** list
25920 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
25930 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
25940 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
25950 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78  ASTERISK.  ** ex
25960 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
25970 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f  pand each one to
25980 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
25990 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a   columns in.  **
259a0 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
259b0 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
259c0 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
259d0 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
259e0 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
259f0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
25a00 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
25a10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
25a20 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
25a30 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
25a40 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
25a50 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
25a60 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
25a70 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  K ) break;.    a
25a80 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25a90 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
25aa0 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght!=0 );.    as
25ab0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
25ac0 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65  _DOT || (pE->pLe
25ad0 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65  ft!=0 && pE->pLe
25ae0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29  ft->op==TK_ID) )
25af0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
25b00 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
25b10 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
25b20 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
25b30 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
25b40 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
25b50 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
25b60 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
25b70 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
25b80 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
25b90 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
25ba0 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
25bb0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
25bc0 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
25bd0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
25be0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
25bf0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
25c00 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
25c10 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
25c20 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
25c30 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
25c40 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
25c50 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
25c60 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
25c70 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
25c80 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
25c90 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
25ca0 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
25cb0 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
25ce0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
25cf0 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
25d00 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
25d10 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
25d20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72   pE = a[k].pExpr
25d30 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
25d40 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
25d50 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
25d60 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
25d70 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
25d80 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
25d90 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26  STERISK.       &
25da0 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
25db0 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
25dc0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20  =TK_ASTERISK).  
25dd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
25de0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
25df0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
25e00 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
25e10 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
25e20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
25e30 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
25e40 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
25e50 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
25e60 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
25e70 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
25e80 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25e90 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
25ea0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
25eb0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
25ec0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
25ed0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
25ee0 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
25ef0 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
25f00 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
25f10 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
25f20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
25f30 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
25f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
25f50 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
25f60 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
25f70 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
25f80 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
25f90 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
25fa0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
25fb0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
25fc0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
25fd0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
25fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
25ff0 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
26000 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
26010 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
26020 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
26030 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
26040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26050 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
26060 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26070 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26080 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
26090 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
260a0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
260b0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
260c0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
260d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
260e0 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
260f0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
26100 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
26110 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
26120 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
26130 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
26140 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
26150 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
26160 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
26170 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
26180 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
26190 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
261a0 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
261b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
261c0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
261d0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
261e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
261f0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
26200 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
26210 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
26220 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
26230 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
26240 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
26250 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
26260 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
26270 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
26280 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
26290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
262a0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
262b0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
262c0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
262d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
262e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
262f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26300 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
26310 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
26320 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
26330 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
26340 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
26350 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
26360 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b  Db].zName : "*";
26370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26380 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
26390 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
263a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
263b0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
263c0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
263d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
263e0 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
263f0 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
26400 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
26410 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
26420 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
26430 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
26440 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
26450 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
26460 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
26470 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
26480 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
26490 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
264a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
264b0 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
264c0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
264d0 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
264e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
264f0 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
26500 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
26510 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
26520 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
26530 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26540 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
26560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
26570 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
26580 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
26590 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   do not include 
265a0 69 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  it in.          
265b0 20 20 2a 2a 20 74 68 65 20 65 78 70 61 6e 64 65    ** the expande
265c0 64 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  d result-set lis
265d0 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
265e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
265f0 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
26600 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
26610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26620 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26640 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
26650 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
26660 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
26670 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
26680 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
26690 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
266a0 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
266b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
266c0 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
266d0 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
266e0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
266f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
26700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26710 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
26720 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
26730 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
26740 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
26750 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
26760 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
26770 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26790 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
267a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
267b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
267c0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
267d0 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
267e0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
267f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
26800 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
26810 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
26820 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
26840 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
26850 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
26860 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
26880 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
268a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
268b0 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
268c0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
268d0 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
268e0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
268f0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
26900 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
26910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26920 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
26930 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
26940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26950 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
26960 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
26970 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26980 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
26990 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
269a0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
269b0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
269c0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
269d0 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
269e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
269f0 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26a10 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26a20 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
26a30 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
26a40 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26a50 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
26a60 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
26a70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26aa0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
26ad0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
26ae0 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
26af0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
26b00 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
26b10 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
26b20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26b30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
26b50 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
26b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26b70 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
26b80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
26b90 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
26ba0 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
26bb0 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
26bc0 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
26bd0 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
26be0 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
26bf0 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
26c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
26c10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
26c20 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
26c30 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
26c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26c50 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
26c60 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
26c70 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
26c80 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
26c90 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
26ca0 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
26cb0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26cd0 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
26ce0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
26cf0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
26d00 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
26d10 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
26d20 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
26d30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26d40 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
26d60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26d70 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
26d80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
26d90 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
26dd0 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
26de0 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
26df0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
26e00 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
26e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
26e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26e30 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
26e40 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
26e50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26e60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26e70 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
26e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26ea0 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
26eb0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
26ec0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
26ed0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26ee0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
26ef0 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
26f00 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
26f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
26f30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
26f40 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
26f50 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
26f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26f70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
26f80 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26f90 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
26fa0 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
26fb0 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
26fc0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
26fd0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
26fe0 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
26ff0 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
27000 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
27010 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
27020 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27030 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
27040 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
27050 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
27060 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
27070 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
27080 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
27090 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
270a0 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
270b0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
270c0 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
270d0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
270e0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
270f0 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
27100 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
27110 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
27120 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
27130 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
27140 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
27150 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
27160 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
27170 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
27180 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
27190 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
271a0 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
271b0 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
271c0 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
271d0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
271e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61  nt sqlite3ExprWa
271f0 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
27200 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
27210 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
27220 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
27230 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
27240 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
27250 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
27260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
27270 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
27280 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
27290 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
272a0 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
272b0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
272c0 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
272d0 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
272e0 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
272f0 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
27300 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
27310 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
27320 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
27330 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
27340 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
27350 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
27360 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
27370 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
27380 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
27390 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
273a0 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
273b0 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
273c0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
273d0 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
273e0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
273f0 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
27400 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
27410 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
27420 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
27430 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
27440 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
27450 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
27460 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
27470 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
27480 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
27490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
274a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
274b0 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
274c0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
274d0 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
274e0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
274f0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
27500 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
27510 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
27520 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
27530 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
27540 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
27550 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53  ound ){.    w.xS
27560 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
27570 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
27580 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
27590 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
275a0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
275b0 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
275c0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
275d0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
275e0 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73   if( (pSelect->s
275f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
27600 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  tiValue)==0 ){. 
27610 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
27620 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
27630 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c  pWith;.  }.  sql
27640 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
27650 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
27660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27670 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
27680 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
27690 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
276a0 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
276b0 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
276c0 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
276d0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
276e0 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
276f0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
27700 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
27710 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
27720 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
27730 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
27740 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27750 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27760 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
27770 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
27780 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
27790 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
277a0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
277b0 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
277c0 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
277d0 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
277e0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
277f0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
27800 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
27810 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
27820 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
27830 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
27840 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
27850 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
27860 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
27870 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
27880 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27890 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
278a0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
278b0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
278c0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
278d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
278e0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
278f0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
27900 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27910 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
27920 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
27930 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
27940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
27950 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
27960 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
27970 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
27980 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
27990 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
279a0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
279b0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
279c0 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
279d0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
279e0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
279f0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
27a00 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
27a10 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
27a20 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
27a30 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
27a40 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
27a50 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
27a60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
27a70 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
27a80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
27a90 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
27aa0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
27ab0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
27ac0 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
27ad0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
27ae0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
27af0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
27b00 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
27b10 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
27b20 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
27b30 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
27b40 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
27b50 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
27b60 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27b70 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
27b80 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
27b90 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
27ba0 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
27bb0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
27bc0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
27bd0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
27be0 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
27bf0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
27c00 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
27c10 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
27c20 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27c30 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
27c40 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
27c50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
27c60 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
27c70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27c80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
27c90 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
27ca0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
27cb0 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
27cc0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
27cd0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
27ce0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
27cf0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
27d00 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
27d10 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
27d20 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
27d30 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
27d40 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
27d50 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27d60 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
27d70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27d80 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
27d90 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
27da0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
27db0 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
27dc0 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
27dd0 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
27de0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
27df0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
27e00 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
27e10 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
27e20 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
27e30 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
27e40 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
27e50 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
27e60 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
27e70 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
27e80 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
27e90 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
27ea0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
27eb0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
27ec0 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
27ed0 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
27ee0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
27ef0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
27f00 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
27f10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
27f20 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
27f30 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
27f40 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
27f50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27f60 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
27f70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
27f80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
27f90 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
27fa0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
27fc0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27fd0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
27fe0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
27ff0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
28000 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
28010 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
28020 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
28030 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
28040 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
28050 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
28060 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28070 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
28080 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
28090 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
280a0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
280b0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
280c0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
280d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
280e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
280f0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
28100 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
28110 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
28120 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
28130 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
28140 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28150 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28160 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
28170 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
28180 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
28190 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
281a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
281b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
281c0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
281d0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
281e0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
281f0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
28200 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
28210 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
28220 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
28230 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
28240 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
28250 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
28260 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
28270 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
28280 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
28290 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
282a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
282b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
282c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
282d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
282e0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
282f0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
28300 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
28310 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
28320 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
28330 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
28340 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
28350 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28360 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
28370 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
28380 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
28390 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
283a0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
283b0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
283c0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
283d0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
283e0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
283f0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
28400 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
28410 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
28420 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
28430 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
28440 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
28450 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
28460 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
28470 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
28480 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
28490 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
284a0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
284b0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
284c0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
284d0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
284e0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
284f0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
28500 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
28510 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
28520 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
28530 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
28540 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
28550 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
28560 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
28570 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
28580 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
28590 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
285a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
285b0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
285c0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
285d0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
285e0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
285f0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
28600 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28610 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
28620 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
28630 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
28640 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
28650 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
28660 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
28670 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28680 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
28690 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
286a0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
286b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
286c0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
286d0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
286e0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
286f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
28700 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
28710 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
28720 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28730 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
28740 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28750 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
28760 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
28770 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
28780 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
287b0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
287c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
287d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
287e0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
287f0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
28800 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
28810 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
28820 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
28830 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
28840 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
28850 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
28860 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
28870 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
28880 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28890 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
288a0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
288b0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
288c0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
288d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
288e0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
288f0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
28900 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
28910 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
28920 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
28930 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
28940 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
28950 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28970 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
28980 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
28990 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
289a0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
289d0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
289e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
289f0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
28a00 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
28a10 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
28a20 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
28a30 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
28a40 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
28a50 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
28a60 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
28a70 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28a80 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28a90 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28aa0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28ab0 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
28ac0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
28ad0 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
28ae0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
28af0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
28b00 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
28b10 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
28b20 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
28b30 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
28b40 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
28b50 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28b60 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
28b70 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
28b80 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
28b90 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
28ba0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
28bb0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
28bc0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
28bd0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28be0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
28bf0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28c00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
28c10 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
28c20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
28c30 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
28c40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
28c50 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
28c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28c70 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
28c80 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
28c90 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
28ca0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
28cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
28cc0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
28cd0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
28ce0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
28cf0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
28d00 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
28d10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
28d20 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
28d30 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
28d40 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
28d50 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
28d60 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
28d70 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
28d80 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
28d90 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
28da0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
28db0 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
28dc0 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
28dd0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
28de0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
28df0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
28e00 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
28e10 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
28e20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
28e30 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
28e40 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
28e50 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
28e60 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
28e70 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
28e80 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
28e90 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
28ea0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
28eb0 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
28ec0 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
28ed0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
28ee0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
28ef0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
28f00 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
28f10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
28f20 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
28f30 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
28f40 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
28f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28f60 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
28f70 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
28f80 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
28f90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
28fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
28fb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
28fc0 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
28fd0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
28fe0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
28ff0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29000 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29010 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
29020 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
29030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29040 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
29050 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
29060 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
29070 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29080 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
29090 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
290a0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
290b0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
290c0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
290d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
290e0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
290f0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
29100 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
29110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
29120 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
29130 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
29140 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29150 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
29170 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
29180 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
29190 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
291a0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
291b0 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
291c0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
291d0 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
291e0 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
291f0 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
29200 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
29210 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29220 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
29230 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
29240 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
29250 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
29260 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
29270 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
29280 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
29290 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
292a0 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
292b0 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
292c0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
292d0 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
292e0 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
292f0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
29300 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
29310 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
29320 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
29330 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
29340 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
29350 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
29360 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
29370 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
29380 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
29390 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
293a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
293b0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
293c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
293d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
293e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
293f0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
29400 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
29410 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
29420 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
29430 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
29440 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
29450 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
29460 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
29470 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
29480 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
29490 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
294a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
294b0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
294c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
294d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
294e0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
294f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
29500 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
29510 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
29520 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
29530 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
29540 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
29550 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
29560 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
29570 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29580 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
29590 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
295a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
295b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
295d0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
295e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
295f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29600 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
29610 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
29620 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
29650 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
29660 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
29670 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
29680 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
29690 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
296a0 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
296b0 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
296c0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
296d0 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
296e0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
296f0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
29700 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
29710 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
29720 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
29730 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
29740 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
29750 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
29760 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
29770 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
29780 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
29790 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
297a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
297b0 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
297c0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
297d0 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
297e0 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
297f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
29800 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
29810 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
29820 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
29830 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
29840 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
29850 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
29860 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
29870 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
29880 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
29890 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
298a0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
298b0 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
298c0 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
298d0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
298e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
298f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29900 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
29910 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
29920 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
29930 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
29940 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
29950 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
29960 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
29970 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
29980 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
29990 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
299a0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
299b0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
299c0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
299d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
299e0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
299f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
29a00 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
29a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
29a20 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
29a30 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29a40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29a50 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29a60 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29a70 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
29a80 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
29a90 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
29aa0 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
29ab0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
29ac0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
29ad0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29ae0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
29af0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
29b00 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
29b10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
29b20 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
29b30 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
29b40 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
29b50 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
29b60 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
29b70 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
29b80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
29b90 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
29ba0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
29bb0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
29bc0 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
29bd0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
29be0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
29bf0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
29c00 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
29c10 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
29c20 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
29c30 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
29c40 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
29c50 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
29c60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
29c70 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
29c80 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
29c90 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
29ca0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
29cb0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
29cc0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
29cd0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
29ce0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
29cf0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
29d00 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
29d10 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
29d20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
29d30 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
29d40 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
29d50 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
29d60 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
29d70 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
29d80 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
29d90 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
29da0 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
29db0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
29dc0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
29dd0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
29de0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
29df0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
29e00 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
29e10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
29e20 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
29e30 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
29e40 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
29e50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
29e60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
29e70 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
29e80 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
29e90 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
29ea0 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
29eb0 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
29ec0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
29ed0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
29ee0 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
29ef0 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
29f00 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
29f10 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
29f20 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
29f30 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
29f40 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
29f50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
29f60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
29f70 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
29f80 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
29f90 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
29fa0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
29fb0 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c  gInfo));.#if SEL
29fc0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
29fd0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
29fe0 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45  ctIndent++;.  SE
29ff0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2a000 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2a010 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2a020 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2a030 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2a040 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2a050 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2a060 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2a070 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2a080 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a090 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a0a0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2a0b0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2a0c0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2a0d0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2a0e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2a0f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2a100 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2a110 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2a120 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2a130 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2a140 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2a150 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2a160 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2a170 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2a180 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2a190 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2a1a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a1b0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2a1c0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2a1d0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2a1e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a1f0 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2a200 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2a210 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2a220 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2a230 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2a240 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2a250 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a260 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2a270 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2a280 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2a290 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2a2a0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2a2b0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2a2c0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2a2d0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2a2e0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2a2f0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2a300 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2a310 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2a320 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2a330 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2a340 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2a350 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2a360 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2a370 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2a380 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2a390 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2a3a0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2a3b0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2a3c0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2a3d0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2a3e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2a3f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2a400 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2a410 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2a420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2a430 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2a440 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2a450 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2a460 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2a470 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2a480 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2a490 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2a4a0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2a4b0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2a4c0 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2a4d0 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2a4e0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2a4f0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2a500 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2a510 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
2a520 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
2a530 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
2a540 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
2a550 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
2a560 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
2a570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a580 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
2a590 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
2a5a0 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
2a5b0 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 2d  Parse, pDest, p-
2a5c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
2a5d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2a5e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
2a5f0 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  if..  /* Try to 
2a600 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2a610 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2a620 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2a630 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2a640 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2a650 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2a660 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2a670 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2a680 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2a690 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2a6a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2a6b0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2a6c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2a6d0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2a6e0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2a6f0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2a700 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2a710 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2a720 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2a730 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2a740 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2a750 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2a760 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2a770 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2a780 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2a790 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2a7a0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2a7b0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2a7c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2a7d0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2a7e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2a7f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2a800 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2a810 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2a820 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2a830 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2a860 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2a870 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2a880 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2a890 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2a8a0 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2a8b0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2a8c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2a8d0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2a8e0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2a8f0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2a900 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2a910 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2a920 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2a930 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2a940 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2a950 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2a960 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2a970 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2a980 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2a990 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2a9a0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2a9b0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2a9c0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2a9d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2a9e0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2a9f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2aa00 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2aa10 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2aa20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2aa30 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2aa40 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2aa50 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2aa60 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2aa70 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2aa80 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2aa90 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2aaa0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2aab0 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2aac0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2aad0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2aae0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2aaf0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2ab00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ab10 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2ab20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2ab30 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2ab40 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2ab50 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2ab60 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2ab70 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2ab80 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2ab90 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2aba0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2abb0 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2abc0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2abd0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2abe0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2abf0 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2ac00 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2ac10 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2ac20 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2ac30 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2ac40 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2ac50 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2ac60 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2ac70 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2ac80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2ac90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2aca0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2acb0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2acc0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2acd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ace0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2acf0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2ad00 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2ad10 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2ad20 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2ad30 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2ad40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2ad50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2ad60 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2ad70 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2ad80 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2ad90 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2ada0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2adb0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2adc0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2add0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2ade0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2adf0 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2ae00 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2ae10 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2ae20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2ae30 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2ae40 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2ae50 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2ae60 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2ae70 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2ae80 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2ae90 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2aea0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2aeb0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2aec0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2aed0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2aee0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2aef0 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2af00 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2af10 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2af20 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2af30 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2af40 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2af50 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2af60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2af70 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2af80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2af90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2afa0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2afb0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2afc0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2afd0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2afe0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2aff0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2b000 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2b010 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2b020 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2b030 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2b040 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2b050 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2b060 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2b070 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2b080 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2b090 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2b0a0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2b0b0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2b0c0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2b0d0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2b0e0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2b0f0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2b100 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2b110 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2b120 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2b130 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2b140 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2b150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2b160 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2b170 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2b180 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2b190 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
2b1a0 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
2b1b0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
2b1c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2b1d0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
2b1e0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
2b1f0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
2b200 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
2b210 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
2b220 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
2b230 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67    if( (pItem->fg
2b240 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
2b250 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26  UTER)==0.     &&
2b260 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2b270 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d  rms(db, pSub, p-
2b280 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
2b290 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a  iCursor).    ){.
2b2a0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2b2b0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
2b2c0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2b2d0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2b2e0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
2b2f0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2b300 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
2b310 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
2b320 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
2b330 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2b340 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2b350 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b360 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2b370 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
2b380 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
2b390 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20  query.    */.   
2b3a0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2b3b0 53 72 63 3d 3d 31 0a 20 20 20 20 20 26 26 20 28  Src==1.     && (
2b3c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b3d0 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26  _All)==0.     &&
2b3e0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2b3f0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2b400 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20  SubqCoroutine). 
2b410 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
2b420 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
2b430 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2b440 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2b450 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2b460 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
2b470 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
2b480 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
2b490 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
2b4a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2b4b0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
2b4c0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2b4d0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2b4e0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2b4f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b500 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
2b510 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2b520 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
2b530 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2b540 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2b550 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2b560 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
2b570 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
2b580 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
2b590 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
2b5a0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
2b5b0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2b5c0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2b5d0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2b5e0 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2b5f0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2b600 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2b610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b620 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2b630 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2b640 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2b650 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c  nRowLogEst = sql
2b660 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d  ite3LogEst(pSub-
2b670 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
2b680 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69      pItem->fg.vi
2b690 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  aCoroutine = 1;.
2b6a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2b6b0 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53  Result = dest.iS
2b6c0 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dst;.      sqlit
2b6d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2b6e0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
2b6f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2b700 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2b710 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2b720 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
2b730 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2b740 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2b750 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
2b760 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2b770 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2b780 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
2b790 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2b7a0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
2b7b0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2b7c0 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
2b7d0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2b7e0 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
2b7f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2b800 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2b810 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2b820 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2b830 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
2b840 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
2b850 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2b860 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
2b870 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
2b880 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
2b890 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
2b8a0 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
2b8b0 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
2b8c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b8d0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b8e0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2b8f0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2b900 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2b910 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2b920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b930 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2b940 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2b950 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2b960 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2b970 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2b980 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2b990 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2b9a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2b9b0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2b9c0 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2b9d0 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2b9e0 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2b9f0 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2ba00 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2ba10 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2ba20 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2ba30 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2ba40 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2ba50 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2ba60 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
2ba70 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
2ba80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2ba90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2baa0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2bab0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2bac0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2bad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2bae0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
2baf0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2bb00 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2bb10 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2bb20 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2bb30 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2bb40 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2bb50 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
2bb60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2bb70 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2bb80 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2bb90 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2bba0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2bbb0 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2bbc0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2bbd0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2bbe0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2bbf0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
2bc00 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
2bc10 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
2bc20 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
2bc30 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
2bc40 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
2bc50 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
2bc60 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2bc70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2bc80 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
2bc90 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2bca0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2bcb0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
2bcc0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2bcd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bce0 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
2bcf0 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
2bd00 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2bd10 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2bd20 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
2bd30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2bd40 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2bd50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
2bd60 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2bd70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2bd80 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d  prHeight(p);.  }
2bd90 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61  .#endif..  /* Va
2bda0 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f  rious elements o
2bdb0 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70  f the SELECT cop
2bdc0 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76  ied into local v
2bdd0 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a  ariables for.  *
2bde0 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f  * convenience */
2bdf0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2be00 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20  EList;.  pWhere 
2be10 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
2be20 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
2be30 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
2be40 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
2be50 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2be60 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
2be70 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
2be80 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  =0;..#if SELECTT
2be90 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2bea0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2beb0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2bec0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2bed0 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2bee0 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d  ("After all FROM
2bef0 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73  -clause analysis
2bf00 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
2bf10 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2bf20 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2bf30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2bf40 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
2bf50 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
2bf60 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
2bf70 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
2bf80 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
2bf90 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
2bfa0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2bfb0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
2bfc0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
2bfd0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
2bfe0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
2bff0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
2c000 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
2c010 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
2c020 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
2c030 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
2c040 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
2c050 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
2c060 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2c070 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
2c080 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
2c090 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2c0a0 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
2c0b0 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
2c0c0 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
2c0d0 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
2c0e0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
2c0f0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
2c100 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
2c110 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
2c120 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
2c130 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
2c140 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2c150 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
2c160 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
2c170 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
2c180 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
2c190 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
2c1a0 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
2c1b0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
2c1c0 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
2c1d0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2c1e0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2c1f0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
2c200 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
2c210 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
2c220 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
2c230 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
2c240 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
2c250 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2c260 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2c270 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
2c280 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
2c290 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
2c2a0 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
2c2b0 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
2c2c0 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
2c2d0 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
2c2e0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
2c2f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
2c300 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
2c310 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
2c320 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
2c330 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
2c340 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
2c350 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
2c360 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
2c370 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
2c380 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
2c390 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
2c3a0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
2c3b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c3c0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
2c3d0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2c3e0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
2c3f0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
2c400 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
2c410 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
2c420 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
2c430 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
2c440 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
2c450 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
2c460 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
2c470 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
2c480 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
2c490 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
2c4a0 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
2c4b0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
2c4c0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
2c4d0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
2c4e0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
2c4f0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
2c500 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2c510 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
2c520 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
2c530 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2c540 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
2c550 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
2c560 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
2c570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
2c580 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2c590 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2c5a0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
2c5b0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2c5c0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2c5d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2c5e0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
2c5f0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
2c600 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
2c610 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
2c620 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2c630 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
2c640 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2c650 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2c660 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
2c670 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
2c680 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
2c690 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
2c6a0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
2c6b0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2c6c0 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
2c6d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2c6e0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2c6f0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
2c700 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
2c710 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
2c720 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
2c730 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
2c740 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
2c750 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2c760 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
2c770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c780 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
2c790 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
2c7a0 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
2c7b0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
2c7c0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
2c7d0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
2c7e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2c7f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
2c800 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52  nSelectRow = LAR
2c810 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f  GEST_INT64;.  co
2c820 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
2c830 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
2c840 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
2c850 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
2c860 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2c870 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2c880 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
2c890 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
2c8a0 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
2c8b0 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
2c8c0 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
2c8d0 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
2c8e0 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
2c8f0 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
2c900 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
2c910 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
2c920 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
2c930 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c940 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2c950 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2c960 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2c970 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
2c980 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
2c990 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c9a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c9b0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2c9e0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2ca10 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2ca20 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2ca30 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
2ca60 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
2ca70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
2ca80 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
2ca90 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2caa0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2cab0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2cac0 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
2cad0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2cae0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2caf0 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
2cb00 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
2cb10 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
2cb20 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
2cb30 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2cb40 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
2cb50 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
2cb60 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
2cb70 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2cb80 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
2cb90 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20  TINCT : 0);..   
2cba0 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2cbb0 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
2cbc0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2cbd0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2cbe0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2cbf0 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
2cc00 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
2cc30 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30  t, wctrlFlags, 0
2cc40 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2cc50 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2cc60 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2cc70 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2cc80 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2cc90 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
2cca0 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
2ccb0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
2ccc0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2ccd0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
2cce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
2ccf0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2cd00 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
2cd10 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2cd20 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
2cd30 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2cd40 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2cd50 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
2cd60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
2cd70 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2cd80 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
2cd90 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
2cda0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2cdb0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
2cdc0 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
2cdd0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2cde0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
2cdf0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2ce00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ce10 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
2ce20 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
2ce30 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
2ce40 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
2ce50 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
2ce60 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
2ce70 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
2ce80 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
2ce90 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
2cea0 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
2ceb0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
2cec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
2ced0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2cee0 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
2cef0 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
2cf00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cf10 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2cf20 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2cf30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2cf40 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
2cf50 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
2cf60 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2cf70 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2cf80 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
2cf90 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
2cfa0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
2cfb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cfc0 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
2cfd0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cff0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2d000 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2d010 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
2d020 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
2d030 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
2d040 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2d050 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
2d060 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
2d070 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
2d080 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
2d090 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
2d0a0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
2d0b0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
2d0c0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
2d0d0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
2d0e0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
2d0f0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
2d100 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2d110 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
2d120 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2d130 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2d140 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
2d150 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2d160 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
2d170 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2d180 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
2d190 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
2d1a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
2d1b0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
2d1c0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
2d1d0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
2d1e0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d200 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
2d210 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
2d220 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
2d230 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
2d260 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
2d270 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
2d280 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
2d290 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
2d2a0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
2d2b0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
2d2c0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
2d2d0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
2d2e0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
2d2f0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
2d300 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
2d310 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
2d320 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
2d330 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
2d340 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
2d350 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
2d360 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
2d370 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
2d380 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
2d390 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
2d3a0 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
2d3b0 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
2d3c0 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
2d3d0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
2d3e0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
2d3f0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
2d400 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
2d410 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
2d420 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
2d430 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
2d440 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
2d450 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
2d460 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
2d470 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2d480 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d4b0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
2d4c0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2d4d0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
2d4e0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2d4f0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
2d500 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
2d510 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
2d520 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
2d530 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
2d540 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2d550 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2d560 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2d570 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2d580 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
2d590 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
2d5a0 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
2d5b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2d5c0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
2d5d0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
2d5e0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2d5f0 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70  electRow>100 ) p
2d600 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
2d610 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  00;.    }else{. 
2d620 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2d630 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 1;.    }.. 
2d640 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2d650 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
2d660 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
2d670 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
2d680 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
2d690 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
2d6a0 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
2d6b0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
2d6c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
2d6d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
2d6e0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
2d6f0 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
2d700 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
2d710 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
2d720 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
2d730 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
2d740 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
2d750 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
2d760 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2d770 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
2d780 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
2d790 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
2d7a0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
2d7b0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
2d7c0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
2d7d0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
2d7e0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
2d7f0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
2d800 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
2d810 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
2d820 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
2d830 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
2d840 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
2d850 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2d860 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2d870 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
2d880 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
2d890 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
2d8a0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
2d8b0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2d8c0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
2d8d0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
2d8e0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
2d8f0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
2d900 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2d910 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
2d920 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
2d930 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
2d940 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
2d950 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
2d960 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
2d970 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
2d980 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
2d990 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
2d9a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
2d9b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2d9c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
2d9d0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
2d9e0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
2d9f0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
2da00 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
2da10 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2da20 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
2da30 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
2da40 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
2da50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2da60 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
2da70 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
2da80 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
2da90 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  upBy->nExpr : 0;
2daa0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
2dab0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2dac0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
2dad0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2dae0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
2daf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2db00 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2db10 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  NC, sSort.pOrder
2db20 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
2db30 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
2db40 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2db50 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
2db60 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
2db70 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
2db80 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
2db90 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
2dba0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2dbb0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
2dbc0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2dbd0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2dbe0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
2dbf0 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
2dc00 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2dc10 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
2dc20 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
2dc30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2dc40 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2dc50 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
2dc60 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
2dc70 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
2dc80 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
2dc90 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2dca0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2dcb0 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
2dcc0 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
2dcd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2dce0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2dcf0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
2dd00 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
2dd10 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
2dd20 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
2dd30 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
2dd40 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
2dd50 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
2dd60 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
2dd70 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
2dd80 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2dd90 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2dda0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
2ddb0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2ddc0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
2ddd0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2dde0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
2ddf0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
2de00 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
2de10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2de20 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
2de30 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
2de40 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2de50 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
2de60 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
2de70 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
2de80 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2de90 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
2dea0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
2deb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
2dec0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
2ded0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
2dee0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
2def0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
2df00 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
2df10 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
2df20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2df30 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
2df40 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2df50 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
2df60 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
2df70 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
2df80 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
2df90 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
2dfa0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2dfb0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
2dfc0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
2dfd0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2dfe0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2dff0 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
2e000 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
2e010 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
2e020 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
2e030 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
2e040 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
2e050 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
2e060 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
2e070 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
2e080 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
2e090 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
2e0a0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
2e0b0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
2e0c0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
2e0d0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
2e0e0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
2e0f0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
2e100 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
2e110 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
2e120 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
2e130 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2e140 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
2e150 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2e160 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2e170 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
2e180 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
2e190 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
2e1a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2e1b0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
2e1c0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
2e1d0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2e1e0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
2e1f0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
2e200 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
2e210 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2e220 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
2e230 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2e240 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2e250 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
2e260 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
2e270 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
2e280 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
2e290 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2e2a0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
2e2b0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2e2c0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
2e2d0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
2e2e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e2f0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2e300 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2e310 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
2e320 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
2e330 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2e340 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
2e350 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2e360 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
2e370 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2e380 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2e390 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2e3a0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2e3b0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
2e3c0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2e3d0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2e3e0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2e3f0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2e400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e410 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
2e420 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2e430 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e440 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
2e450 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2e460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e470 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2e480 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2e490 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e4a0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
2e4b0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
2e4c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e4d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2e4e0 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
2e4f0 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
2e500 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
2e510 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
2e520 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
2e530 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
2e540 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
2e550 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
2e560 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
2e570 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
2e580 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
2e590 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
2e5a0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
2e5b0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
2e5c0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
2e5d0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
2e5e0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
2e5f0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2e600 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
2e610 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
2e620 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e630 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e640 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2e650 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2e660 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
2e670 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2e680 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2e690 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
2e6a0 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
2e6b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
2e6c0 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
2e6d0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
2e6e0 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
2e6f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2e700 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2e710 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2e720 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2e730 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2e740 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
2e750 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
2e760 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
2e770 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
2e780 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
2e790 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
2e7a0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
2e7b0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
2e7c0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2e7d0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
2e7e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
2e7f0 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
2e800 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
2e810 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
2e820 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
2e830 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
2e840 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
2e850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e860 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
2e870 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
2e880 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
2e890 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
2e8a0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
2e8b0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
2e8c0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
2e8d0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
2e8e0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
2e8f0 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
2e900 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2e910 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2e920 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
2e930 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
2e940 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
2e950 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
2e960 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
2e970 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
2e980 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
2e990 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
2e9a0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
2e9b0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2e9c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2e9d0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
2e9e0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
2e9f0 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
2ea00 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
2ea20 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
2ea30 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
2ea40 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
2ea50 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
2ea60 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
2ea70 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
2ea80 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2ea90 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2eaa0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2eab0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2eac0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2ead0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
2eae0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
2eaf0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2eb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
2eb10 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
2eb20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2eb30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2eb40 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
2eb50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2eb60 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
2eb70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2eb80 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2eb90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2eba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2ebb0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2ebc0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
2ebd0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
2ebe0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2ebf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ec00 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2ec10 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2ec20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2ec30 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2ec40 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2ec50 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2ec60 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2ec70 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2ec80 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2ec90 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2eca0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ecb0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2ecc0 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a  nToReg(pParse, .
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ecf0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
2ed00 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
2ed10 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20  iTable, r1);.   
2ed20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2ed30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ed40 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2ed50 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2ed60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2ed70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ed80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2ed90 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2eda0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2edb0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2edc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2edd0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2ede0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2edf0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2ee00 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2ee10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ee20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2ee30 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2ee40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2ee50 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2ee60 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2ee70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ee80 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2ee90 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2eea0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2eeb0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2eec0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2eed0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2eee0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2eef0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2ef00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ef10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2ef20 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2ef30 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2ef40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2ef50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ef60 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2ef70 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2ef80 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2ef90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2efa0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2efb0 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2efc0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2efd0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2efe0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2eff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2f000 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2f010 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2f020 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f030 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2f040 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2f050 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2f060 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2f070 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2f080 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2f090 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2f0a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2f0b0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2f0c0 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2f0d0 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2f0e0 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2f0f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f100 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2f110 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2f120 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2f130 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2f140 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2f150 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2f160 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2f170 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2f180 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2f190 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2f1a0 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2f1b0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2f1c0 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2f1d0 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2f1e0 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2f1f0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2f200 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2f210 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2f220 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2f230 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2f240 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2f250 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2f260 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2f270 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2f280 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2f290 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2f2a0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2f2b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2f2c0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2f2d0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2f2e0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2f2f0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2f300 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2f310 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2f320 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2f330 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2f340 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2f350 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2f360 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2f370 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2f380 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2f390 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2f3a0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2f3b0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2f3c0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2f3d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f3e0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2f3f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f400 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2f410 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2f420 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2f430 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2f440 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2f450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f460 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
2f470 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2f480 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72      sortOut, sor
2f4b0 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  tPTab);.      }.
2f4c0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f4d0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
2f4e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2f4f0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2f500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f510 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f520 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
2f530 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
2f540 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
2f550 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
2f560 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
2f570 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2f580 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2f590 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
2f5a0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
2f5b0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2f5c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2f5d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f5e0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
2f5f0 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
2f600 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f620 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2f630 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
2f640 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
2f650 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2f660 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
2f670 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f680 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f690 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f6a0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c  P_Jump, addr1+1,
2f6b0 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64   0, addr1+1); Vd
2f6c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
2f6d0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f6e0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2f6f0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2f700 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2f710 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2f720 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2f730 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2f740 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2f750 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2f760 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2f770 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2f780 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2f790 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2f7a0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2f7b0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2f7c0 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2f7d0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2f7e0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2f7f0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2f800 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2f810 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2f820 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2f830 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2f840 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2f850 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2f860 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2f870 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2f880 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2f890 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2f8a0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2f8b0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2f8c0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2f8d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2f8e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f8f0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2f900 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2f910 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2f920 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f930 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2f940 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f960 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2f970 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
2f980 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f990 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f9a0 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
2f9b0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2f9c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f9d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2f9e0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2f9f0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
2fa00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2fa10 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2fa20 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2fa30 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2fa40 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2fa50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2fa60 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2fa70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2fa80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fa90 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2faa0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
2fab0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2fac0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2fad0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2fae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2faf0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2fb00 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
2fb10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fb20 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2fb30 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
2fb40 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2fb50 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2fb60 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
2fb70 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2fb80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2fb90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fba0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
2fbb0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2fbc0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
2fbd0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
2fbe0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2fbf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fc00 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2fc10 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2fc20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2fc30 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
2fc40 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
2fc50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2fc60 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
2fc70 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
2fc80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fc90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fca0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2fcb0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2fcc0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2fcd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2fce0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
2fcf0 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
2fd00 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
2fd10 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
2fd20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2fd30 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
2fd40 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
2fd50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2fd60 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2fd70 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
2fd80 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2fd90 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
2fda0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
2fdb0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
2fdc0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
2fdd0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
2fde0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
2fdf0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
2fe00 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
2fe10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
2fe20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
2fe30 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
2fe40 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
2fe50 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
2fe60 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2fe70 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
2fe80 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
2fe90 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2fea0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
2feb0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
2fec0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
2fed0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
2fee0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
2fef0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
2ff00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2ff10 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2ff20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ff30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
2ff40 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2ff50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ff60 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
2ff70 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2ff80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2ff90 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2ffa0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2ffb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2ffc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2ffd0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2ffe0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2fff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
30000 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
30010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30020 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
30030 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
30040 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
30050 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
30060 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
30070 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
30080 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
30090 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
300a0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
300b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
300c0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
300d0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
300e0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
300f0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
30100 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
30110 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
30120 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
30130 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
30140 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
30150 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
30160 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
30170 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
30180 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a  st, -1, &sSort,.
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74        &sDistinct
301b0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
301d0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
301e0 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
301f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30200 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
30210 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
30220 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
30230 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
30240 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
30250 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
30260 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
30270 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
30280 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
30290 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
302a0 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
302b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
302c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
302d0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
302e0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
302f0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
30300 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
30310 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30320 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
30330 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
30340 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
30350 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67  upBy.  Begin agg
30360 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77  regate queries w
30370 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a  ithout GROUP BY:
30380 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
30390 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
303a0 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
303b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
303c0 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
303d0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
303e0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
303f0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
30400 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
30410 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
30420 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
30430 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
30440 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
30450 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
30460 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
30470 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
30480 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
30490 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
304a0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
304b0 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
304c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
304d0 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
304e0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
304f0 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
30500 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
30510 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30520 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
30530 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
30540 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
30550 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
30560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
30570 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
30580 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
30590 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
305a0 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
305b0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
305c0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
305d0 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
305e0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
305f0 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
30600 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
30610 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
30620 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
30630 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
30640 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
30650 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
30660 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
30670 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
30680 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
30690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
306a0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
306b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
306c0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
306d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
306e0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
306f0 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
30700 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
30710 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
30720 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
30730 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30750 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
30760 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
30770 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
30780 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
30790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
307a0 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
307b0 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
307c0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
307d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
307e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
307f0 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
30800 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
30810 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
30820 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
30830 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
30840 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
30850 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
30860 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
30870 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
30880 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
30890 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
308a0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
308b0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
308c0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
308d0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
308e0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
308f0 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
30900 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
30910 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
30920 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
30930 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
30940 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
30950 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
30960 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
30970 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
30980 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
30990 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
309a0 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
309b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
309c0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
309d0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
309e0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
309f0 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
30a00 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
30a10 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
30a20 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
30a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
30a40 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
30a50 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
30a60 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
30a70 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
30a80 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
30a90 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
30aa0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
30ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30ac0 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
30ad0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
30ae0 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
30af0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
30b00 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
30b10 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
30b20 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
30b30 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
30b40 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
30b50 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
30b60 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
30b70 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
30b80 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
30b90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30ba0 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
30bb0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
30bc0 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
30bd0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
30be0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
30bf0 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
30c00 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
30c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
30c20 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
30c30 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
30c40 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
30c50 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
30c60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
30c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
30c80 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
30c90 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
30ca0 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
30cb0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
30cc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30cd0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
30ce0 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
30cf0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
30d00 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
30d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
30d30 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
30d40 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
30d50 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
30d60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
30d70 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
30d80 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
30d90 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
30da0 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
30db0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
30dc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
30dd0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
30de0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
30df0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
30e00 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
30e10 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
30e20 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
30e30 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30e40 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
30e50 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
30e60 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
30e70 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
30e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30e90 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
30ea0 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
30eb0 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
30ec0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
30ed0 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
30ee0 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
30ef0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
30f00 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
30f10 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
30f20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
30f30 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
30f40 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
30f50 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
30f60 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
30f70 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
30f80 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
30f90 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
30fa0 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
30fb0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
30fc0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
30fd0 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
30fe0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
30ff0 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
31000 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
31010 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
31020 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
31030 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
31040 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
31050 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
31060 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
31070 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31080 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
31090 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
310a0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
310b0 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
310c0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
310d0 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
310e0 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  or as follows:. 
310f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31100 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
31110 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
31120 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
31130 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
31140 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
31150 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
31160 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
31170 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
31180 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
31190 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
311a0 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
311b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
311c0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
311d0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
311e0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
311f0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
31200 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
31210 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
31220 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
31230 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
31240 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
31250 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
31260 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
31270 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
31280 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
31290 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
312a0 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
312b0 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
312c0 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
312d0 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
312e0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
312f0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
31300 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
31310 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
31320 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  Y_NORMAL;.      
31330 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72    .        asser
31340 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
31350 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
31360 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a  ert( flag==0 );.
31370 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
31380 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  Having==0 ){.   
31390 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69         flag = mi
313a0 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49  nMaxQuery(&sAggI
313b0 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a  nfo, &pMinMax);.
313c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
313d0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
313e0 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30  0 || (pMinMax!=0
313f0 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   && pMinMax->nEx
31400 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20  pr==1) );..     
31410 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
31420 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
31430 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
31440 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61  stDup(db, pMinMa
31450 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  x, 0);.         
31460 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b   pDel = pMinMax;
31470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31480 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d  MinMax && !db->m
31490 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
314a0 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
314b0 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  ax->a[0].sortOrd
314c0 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45  er = flag!=WHERE
314d0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a  _ORDERBY_MIN ?1:
314e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
314f0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
31500 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
31510 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  MN;.          }.
31520 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
31530 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
31540 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
31550 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
31560 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
31570 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
31580 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
31590 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
315a0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
315b0 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
315c0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
315d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
315e0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
315f0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
31600 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31610 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
31620 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
31630 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
31640 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30  Where, pMinMax,0
31650 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
31660 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
31670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31680 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
31690 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
316a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
316b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
316c0 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
316d0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
316e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
316f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31700 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
31710 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
31720 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31730 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
31740 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
31750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31760 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
31770 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
31780 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
31790 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
317a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29  omment((v, "%s()
317b0 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20   by index",.    
317c0 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61              (fla
317d0 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
317e0 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
317f0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
31800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
31810 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
31820 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
31830 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
31840 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
31850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31860 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
31870 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
31880 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
31890 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
318a0 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
318b0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
318c0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
318d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
318e0 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  EList, -1, 0, 0,
318f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31900 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
31910 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
31920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
31930 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31940 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pDel);.    }. 
31950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
31960 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
31970 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
31980 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
31990 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
319a0 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54  if( sDistinct.eT
319b0 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
319c0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
319d0 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  D ){.    explain
319e0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
319f0 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20  , "DISTINCT");. 
31a00 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
31a10 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
31a20 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
31a30 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
31a40 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
31a50 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
31a60 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
31a70 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
31a80 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
31a90 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
31aa0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
31ab0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
31ac0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f          sSort.nO
31ad0 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20  BSat>0 ? "RIGHT 
31ae0 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59  PART OF ORDER BY
31af0 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  ":"ORDER BY");. 
31b00 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
31b10 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ail(pParse, p, &
31b20 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  sSort, pEList->n
31b30 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
31b40 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
31b50 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
31b60 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
31b70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
31b80 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
31b90 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68   /* The SELECT h
31ba0 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49  as been coded. I
31bb0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
31bc0 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
31bd0 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a   structure,.  **
31be0 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
31bf0 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72  code to 1. Other
31c00 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20  wise 0. */.  rc 
31c10 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  = (pParse->nErr>
31c20 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f  0);..  /* Contro
31c30 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
31c40 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
31c50 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
31c60 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
31c70 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
31c80 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
31c90 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
31ca0 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
31cb0 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
31cc0 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
31cd0 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
31ce0 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
31cf0 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
31d00 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
31d10 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
31d20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
31d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
31d40 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31d50 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
31d60 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
31d70 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
31d80 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
31d90 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
31da0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
31db0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
31dc0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
31dd0 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
31de0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31df0 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
31e00 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
31e10 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
31e20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
31e30 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
31e40 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
31e50 3b 0a 7d 0a                                      ;.}.