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

Artifact 0495e86f8377026fbd529a1a5bf62046cbb6eec5:


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 30 2c 20 70  iesFromName(0, p
e4a0: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
e4b0: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
e4c0: 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
e4d0: 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
e4e0: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
e4f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
e500: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
e510: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74  te3HashClear(&ht
e520: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e530: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e540: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
e550: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
e560: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
e570: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
e580: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
e590: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
e5a0: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
e5b0: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
e5c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
e5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
e600: 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
e610: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
e620: 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
e630: 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
e640: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
e650: 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
e660: 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
e670: 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
e680: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
e690: 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
e6a0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
e6b0: 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
e6c0: 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
e6d0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
e6e0: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
e6f0: 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
e700: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
e710: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
e720: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
e730: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
e740: 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
e750: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
e760: 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
e770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e780: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
e790: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
e7a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e7b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e7c0: 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
e7d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
e7f0: 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
e800: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
e810: 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
e820: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
e830: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
e840: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
e850: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e860: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e870: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e880: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
e890: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
e8a0: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
e8b0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
e8c0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
e8d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e8e0: 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41  em *a;.  u64 szA
e8f0: 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
e900: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
e910: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
e920: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
e930: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
e940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
e950: 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74  b->nCol==pSelect
e960: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
e970: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
e980: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
e990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e9a0: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
e9b0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
e9c0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53  (sNC));.  sNC.pS
e9d0: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
e9e0: 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53  ->pSrc;.  a = pS
e9f0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
ea00: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
ea10: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
ea20: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
ea30: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20   pCol++){.    p 
ea40: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
ea50: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79 70    if( pCol->zTyp
ea60: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  e==0 ){.      pC
ea70: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
ea80: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ea90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eaa0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 54           columnT
eab0: 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c  ype(&sNC, p,0,0,
eac0: 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  0, &pCol->szEst)
ead0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 41  );.    }.    szA
eae0: 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73  ll += pCol->szEs
eaf0: 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  t;.    pCol->aff
eb00: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
eb10: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
eb20: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
eb30: 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c  finity==0 ) pCol
eb40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
eb50: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
eb60: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
eb70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
eb80: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
eb90: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e   pColl && pCol->
eba0: 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  zColl==0 ){.    
ebb0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
ebc0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ebd0: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
ebe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
ebf0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
ec00: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
ec10: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
ec20: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
ec30: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
ec40: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
ec50: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
ec60: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
ec70: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
ec80: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
ec90: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
eca0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
ecb0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
ecc0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
ecd0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
ece0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ecf0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
ed00: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
ed10: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
ed20: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
ed30: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
ed40: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ed50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ed60: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ed70: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ed80: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ed90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
eda0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
edb0: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
edc0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
edd0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
ede0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
edf0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
ee00: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
ee10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ee20: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
ee30: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
ee40: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
ee50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
ee60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
ee70: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
ee80: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
ee90: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
eea0: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
eeb0: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
eec0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
eed0: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
eee0: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
eef0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
ef00: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
ef10: 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
ef20: 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
ef30: 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
ef40: 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
ef50: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ef60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ef70: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ef80: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ef90: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
efa0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
efb0: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
efc0: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
efd0: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
efe0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
eff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f000: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
f010: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
f020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
f040: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
f050: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
f060: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
f070: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
f080: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
f090: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
f0a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
f0b0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
f0c0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
f0d0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
f0e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
f0f0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
f100: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f110: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
f120: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
f130: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
f140: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
f150: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f160: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
f170: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
f180: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
f190: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f1a0: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
f1b0: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
f1c0: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
f1d0: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
f1e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
f1f0: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f200: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
f210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
f220: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f230: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
f240: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
f250: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
f260: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
f270: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f280: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
f290: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f2a0: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
f2b0: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
f2c0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
f2d0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
f2e0: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
f2f0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
f300: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
f310: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f320: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f330: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f340: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f350: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f360: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f370: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f380: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f390: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f3a0: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f3b0: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f3c0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f3d0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f3e0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f3f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f400: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f410: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f420: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f430: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f440: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f450: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f460: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f470: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f480: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f490: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f4a0: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f4b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f4c0: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f4d0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f4e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f4f0: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f500: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f510: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f520: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f530: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f540: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f550: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f560: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f570: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f580: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f590: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f5a0: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f5b0: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f5c0: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f5d0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f5e0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f5f0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f600: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f610: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f620: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f630: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f640: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f650: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f660: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f670: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f680: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f690: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f6a0: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f6b0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f6c0: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f6d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f6e0: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f6f0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f700: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70    int n;.  if( p
f710: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
f720: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
f730: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
f740: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
f750: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
f760: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
f770: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
f780: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
f790: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
f7a0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
f7b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
f7c0: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
f7d0: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
f7e0: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
f7f0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
f800: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
f810: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
f820: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
f830: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
f840: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
f850: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
f860: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
f870: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
f880: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f890: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
f8a0: 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
f8b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
f8c0: 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
f8d0: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
f8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
f900: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f910: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f920: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
f930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
f940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f950: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
f960: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f970: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f980: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f990: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f9a0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f9b0: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f9d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f9e0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f9f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
fa00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fa10: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
fa20: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
fa30: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa40: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fa50: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
fa60: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
fa70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa80: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
fa90: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
faa0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fab0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
fac0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
fad0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
fae0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
faf0: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
fb00: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
fb10: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
fb20: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
fb30: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
fb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fb50: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
fb60: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
fb70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fb90: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
fba0: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
fbb0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
fbc0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
fbd0: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
fbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fbf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
fc00: 65 74 49 66 4e 6f 74 50 6f 73 2c 20 69 4f 66 66  etIfNotPos, iOff
fc10: 73 65 74 2c 20 69 4f 66 66 73 65 74 2c 20 30 29  set, iOffset, 0)
fc20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fc30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fc40: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
fc50: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
fc60: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fc70: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
fc80: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
fc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fca0: 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74  3(v, OP_SetIfNot
fcb0: 50 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Pos, iLimit, iOf
fcc0: 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a 20 20 20  fset+1, -1);.   
fcd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
fce0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fcf0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
fd00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
fd10: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
fd20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
fd30: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
fd40: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
fd50: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
fd60: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
fd70: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
fd80: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
fd90: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
fda0: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
fdb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fdc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
fdd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fde0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
fdf0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
fe00: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
fe10: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
fe20: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
fe30: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
fe40: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
fe50: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
fe60: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
fe70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
fe80: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
fe90: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
fea0: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
feb0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
fec0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
fed0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
fee0: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
fef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
ff00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
ff10: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
ff20: 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65   /* iCol must be
ff30: 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45   less than p->pE
ff40: 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74  List->nExpr.  Ot
ff50: 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
ff60: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65   would.  ** have
ff70: 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72   been thrown dur
ff80: 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ing name resolut
ff90: 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ion and we would
ffa0: 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e   not have gotten
ffb0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a  .  ** this far *
ffc0: 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  /.  if( pRet==0 
ffd0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
ffe0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
fff0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
10000 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10010 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
10020 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
10030 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
10040 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
10050 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
10060 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
10070 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
10080 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
10090 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
100a0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
100b0 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
100c0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
100d0 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
100e0 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
100f0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
10100 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
10110 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
10120 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
10130 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
10140 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
10150 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
10160 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
10170 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
10180 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
10190 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
101a0 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
101b0 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
101c0 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
101d0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
101e0 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
101f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10200 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
10210 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10220 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
10230 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
10240 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
10250 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
10260 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10270 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
10280 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
10290 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
102a0 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
102b0 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
102c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
102d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
102e0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
102f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10300 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
10310 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
10320 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
10330 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
10340 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
10350 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
10360 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
10370 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
10380 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
103a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
103b0 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
103c0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
103d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
103e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
103f0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
10400 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
10410 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
10420 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
10430 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
10440 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
10450 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
10460 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
10470 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
10480 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
10490 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
104a0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
104b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
104c0 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
104d0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
104e0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
104f0 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
10500 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
10510 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
10520 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
10530 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
10540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10550 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
10560 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10570 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
10580 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
10590 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
105a0 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
105b0 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
105c0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
105d0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
105e0 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
105f0 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
10600 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
10610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10620 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10630 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10640 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10650 5f 5f 5f 5f 5f 2f 0a 2a 2a 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 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
106a0 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
106b0 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
106c0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
106d0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
106e0 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
106f0 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
10700 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
10710 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73  cList->a[].fg.is
10720 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
10730 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
10740 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
10750 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
10760 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
10770 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
10780 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
10790 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
107a0 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
107b0 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
107c0 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
107d0 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
107e0 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
107f0 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
10800 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
10810 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10820 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
10830 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
10840 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
10850 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
10860 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
10870 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
10880 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
10890 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
108a0 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
108b0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
108c0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
108d0 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
108e0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
108f0 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
10900 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
10910 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10920 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10930 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
10940 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
10950 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
10960 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
10970 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
10980 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
10990 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
109a0 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
109b0 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
109c0 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
109d0 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
109e0 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
109f0 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
10a00 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
10a10 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10a20 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
10a30 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
10a40 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
10a50 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
10a60 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
10a70 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
10a80 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
10a90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
10aa0 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
10ab0 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
10ac0 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
10ad0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
10ae0 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
10af0 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
10b00 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
10b10 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10b20 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
10b30 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
10b40 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
10b50 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
10b60 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
10b70 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
10b80 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
10b90 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
10ba0 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
10bb0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10bc0 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
10bd0 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
10be0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10bf0 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
10c00 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
10c10 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10c20 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
10c30 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
10c40 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
10c50 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
10c60 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
10c70 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
10c80 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
10c90 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
10ca0 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
10cb0 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
10cc0 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
10cd0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
10ce0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
10cf0 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
10d00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10d10 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10d20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10d30 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10d40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10d50 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10d60 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10d70 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10d80 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10d90 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10da0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
10db0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
10dc0 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
10dd0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10de0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10df0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10e00 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10e10 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10e20 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10e30 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10e40 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10e50 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10e60 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10e70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10e80 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10e90 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
10ea0 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
10eb0 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
10ec0 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
10ed0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ef0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10f00 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10f10 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10f20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10f30 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10f40 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10f50 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10f70 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10f80 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
10f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fa0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10fb0 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
10fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
10fd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
10ff0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
11000 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
11010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11020 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
11030 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
11040 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
11050 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
11060 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
11070 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
11080 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
11090 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
110a0 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
110b0 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
110c0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
110d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
110f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11100 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11120 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11130 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11140 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
11150 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
11160 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11170 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
11180 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
11190 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
111a0 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
111b0 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
111c0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
111d0 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
111e0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
111f0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
11200 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
11210 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
11220 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
11230 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11240 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
11250 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
11260 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
11270 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
11280 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
11290 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
112a0 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
112b0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
112c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
112d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
112e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
112f0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
11300 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11310 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
11320 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
11330 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
11340 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
11350 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
11360 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
11370 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
11380 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
11390 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
113a0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
113b0 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
113c0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
113d0 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
113e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
113f0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
11400 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
11410 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
11420 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
11430 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
11440 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
11450 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
11460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11470 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
11480 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
11490 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
114a0 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
114b0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
114c0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
114d0 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
114e0 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
114f0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
11500 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
11510 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
11520 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
11530 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
11540 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
11550 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
11560 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
11570 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
11580 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
11590 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
115a0 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
115b0 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
115c0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
115d0 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
115e0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
115f0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
11600 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
11610 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11620 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
11630 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
11640 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
11650 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
11660 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
11670 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
11680 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
11690 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
116a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116b0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
116c0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
116d0 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
116e0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
116f0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
11700 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
11710 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
11720 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
11730 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
11740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11750 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11760 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11770 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
117a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
117b0 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
117c0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
117d0 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
117e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117f0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
11800 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11810 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
11820 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
11830 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
11840 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
11850 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
11860 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
11870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11880 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11890 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
118a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
118b0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
118c0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
118d0 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
118e0 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
118f0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
11900 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
11910 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11920 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11930 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
11940 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
11950 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
11960 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
11970 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11980 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
11990 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
119a0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
119b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
119c0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
119d0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
119e0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
119f0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
11a00 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
11a10 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
11a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a30 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
11a40 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
11a50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11a60 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
11a70 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
11a80 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
11a90 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
11aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11ab0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
11ac0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
11ad0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
11ae0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
11af0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
11b00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11b10 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
11b20 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
11b30 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
11b40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b60 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
11b70 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
11b80 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
11b90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11ba0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
11bb0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
11bc0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
11bd0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
11be0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
11bf0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11c00 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
11c10 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
11c20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
11c30 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
11c40 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
11c50 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
11c60 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
11c70 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
11c80 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
11c90 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11ca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11cb0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
11cc0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
11cd0 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
11ce0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
11cf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11d00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11d10 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
11d20 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
11d30 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
11d40 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
11d50 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
11d60 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
11d70 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
11d80 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
11d90 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
11da0 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69   Queue..  */.  i
11db0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
11dc0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
11dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11de0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65  rMsg(pParse, "re
11df0 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74  cursive aggregat
11e00 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75  e queries not su
11e10 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c  pported");.  }el
11e20 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  se{.    p->pPrio
11e30 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
11e40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11e50 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11e70 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
11e80 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11e90 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4b  tup;.  }..  /* K
11ea0 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
11eb0 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
11ec0 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
11ed0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
11ee0 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
11ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11f00 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11f10 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
11f20 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11f30 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
11f40 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
11f50 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
11f60 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
11f70 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11f80 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
11f90 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  it;.  p->pOffset
11fa0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65   = pOffset;.  re
11fb0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11fc0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
11fd0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
11fe0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
11ff0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12000 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
12010 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12020 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12040 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12050 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
12060 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12070 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12080 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12090 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120a0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120b0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
120c0 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65  /*.** Handle the
120d0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66   special case of
120e0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
120f0 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
12100 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c  es from a.** VAL
12110 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20  UES clause.  By 
12120 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73  handling this as
12130 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c   a special case,
12140 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a   we avoid deep.*
12150 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64  * recursion, and
12160 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65   thus do not nee
12170 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65  d to enforce the
12180 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
12190 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a  MPOUND_SELECT.**
121a0 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61   on a VALUES cla
121b0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75  use..**.** Becau
121c0 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  se the Select ob
121d0 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20  ject originates 
121e0 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c  from a VALUES cl
121f0 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 49  ause:.**   (1) I
12200 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  t has no LIMIT o
12210 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28 32  r OFFSET.**   (2
12220 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  ) All terms are 
12230 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20 28  UNION ALL.**   (
12240 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4f  3) There is no O
12250 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
12260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
12270 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a  tiSelectValues(.
12280 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12290 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
122a0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
122b0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
122c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
122d0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
122e0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
122f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
12300 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
12310 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
12320 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
12330 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
12340 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20  r;.  int nRow = 
12350 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  1;.  int rc = 0;
12360 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
12370 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
12380 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
12390 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
123a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
123b0 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
123c0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
123d0 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
123e0 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
123f0 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
12400 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
12410 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12420 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
12430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12440 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
12450 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
12460 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
12470 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
12480 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
12490 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
124a0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
124b0 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
124c0 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
124d0 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68     nRow++;.  }wh
124e0 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28  ile(1);.  while(
124f0 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72   p ){.    pPrior
12500 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
12510 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
12520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12530 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12540 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70  p, pDest);.    p
12550 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
12560 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  r;.    if( rc ) 
12570 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
12580 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
12590 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
125a0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
125b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
125c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
125d0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
125e0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
125f0 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
12600 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
12610 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
12620 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
12630 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
12640 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
12650 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
12660 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12670 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
12680 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
12690 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
126a0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
126b0 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
126c0 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
126d0 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
126e0 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
126f0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
12700 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
12710 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
12720 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
12730 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
12740 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
12750 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
12760 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
12770 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
12780 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
12790 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
127a0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
127b0 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
127c0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
127d0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
127e0 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
127f0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
12800 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
12810 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
12820 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
12830 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12840 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
12850 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
12860 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
12870 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12880 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12890 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
128a0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
128b0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
128c0 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
128d0 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
128e0 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
128f0 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
12900 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
12910 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
12920 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
12930 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
12940 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
12950 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
12960 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
12970 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
12980 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
12990 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
129a0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
129b0 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
129c0 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
129d0 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
129e0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
129f0 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
12a00 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
12a10 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
12a20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
12a30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12a40 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12a50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12a60 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12a70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12a80 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12a90 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12aa0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12ab0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12ac0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12ad0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12ae0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12af0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
12b00 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
12b10 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12b20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12b30 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12b40 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12b50 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12b60 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12b80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12b90 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
12ba0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
12bb0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
12bc0 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
12bd0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
12be0 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
12bf0 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
12c00 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
12c10 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
12c20 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12c30 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12c40 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
12c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
12c60 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
12c70 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
12c80 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
12c90 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
12ca0 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
12cb0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12cc0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
12cd0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
12ce0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12cf0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12d00 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
12d10 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
12d20 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
12d30 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
12d40 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
12d50 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
12d60 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12d70 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
12d80 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12d90 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
12da0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
12db0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
12dc0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
12dd0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12de0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
12df0 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
12e00 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
12e10 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
12e20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
12e30 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12e40 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
12e50 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
12e60 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12e70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12e80 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12e90 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
12ea0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12eb0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12ec0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12ed0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12ee0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12ef0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12f00 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
12f10 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
12f20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12f30 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
12f40 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f50 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f60 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f70 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f80 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f90 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12fa0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
12fb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12fc0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12fd0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
12fe0 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
12ff0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
13000 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
13010 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
13020 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
13030 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
13040 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
13050 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13060 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
13070 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
13080 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
13090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
130b0 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
130c0 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
130d0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
130e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
130f0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
13100 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
13110 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
13120 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
13130 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
13140 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
13150 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
13160 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
13170 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13180 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13190 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
131a0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
131b0 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
131c0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
131d0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
131e0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
131f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
13200 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
13210 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
13220 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
13230 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
13240 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
13250 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
13260 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
13270 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
13280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13290 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
132a0 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
132b0 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66  Expr );..#ifndef
132c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
132d0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
132e0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
132f0 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
13300 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
13310 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
13320 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
13330 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
13340 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
13350 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
13360 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
13370 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
13380 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13390 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
133a0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
133b0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
133c0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
133d0 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  else..  /* Gener
133e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
133f0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
13400 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13410 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
13420 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
13430 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
13440 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
13450 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
13460 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
13470 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
13480 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
13490 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
134a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
134b0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
134c0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
134d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
134e0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
134f0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
13500 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
13510 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13520 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13530 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13540 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13550 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13560 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13570 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
13580 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
13590 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
135a0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
135b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
135c0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
135d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
135e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
135f0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
13600 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
13610 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
13620 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
13630 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
13640 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
13650 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13660 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13670 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
13680 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
13690 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
136a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
136b0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
136c0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
136d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
136e0 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  iOffset ){.     
136f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13700 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
13710 49 66 4e 6f 74 50 6f 73 2c 20 70 2d 3e 69 4f 66  IfNotPos, p->iOf
13720 66 73 65 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  fset, p->iOffset
13730 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13750 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 70 2d 3e  3(v, OP_Add, p->
13760 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73  iLimit, p->iOffs
13770 65 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  et, p->iOffset+1
13780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13790 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
137a0 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73  , OP_SetIfNotPos
137b0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e  , p->iLimit, p->
137c0 69 4f 66 66 73 65 74 2b 31 2c 20 2d 31 29 3b 0a  iOffset+1, -1);.
137d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
137e0 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
137f0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
13800 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
13810 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
13820 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13830 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
13840 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
13850 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13860 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
13870 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
13880 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13890 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
138a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
138b0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
138c0 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
138d0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
138e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
138f0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
13900 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
13910 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
13920 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
13930 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36  nSelectRow > (u6
13940 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20  4)nLimit .      
13950 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
13960 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69  electRow = nLimi
13970 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
13980 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
13990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
139a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
139b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
139c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
139d0 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
139e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
139f0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
13a00 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
13a10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
13a20 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
13a30 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
13a40 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
13a50 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
13a60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
13a70 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
13a80 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
13a90 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
13aa0 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
13ab0 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
13ac0 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
13ad0 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
13ae0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
13af0 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
13b00 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
13b10 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
13b20 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
13b30 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
13b40 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65  lectDest unionde
13b50 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63  st;..      testc
13b60 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45  ase( p->op==TK_E
13b70 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74  XCEPT );.      t
13b80 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13b90 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
13ba0 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
13bb0 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
13bc0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
13bd0 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
13be0 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
13bf0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
13c00 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
13c10 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
13c20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
13c30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13c40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13c50 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
13c60 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13c70 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13c80 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13c90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13ca0 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20  et==0 );     /* 
13cb0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13cc0 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
13ce0 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
13cf0 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
13d00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
13d10 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
13d20 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
13d30 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
13d40 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
13d50 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
13d60 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
13d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
13d80 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
13d90 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
13da0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
13db0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
13dc0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
13dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13de0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
13df0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
13e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13e10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13e20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
13e30 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13e40 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
13e50 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
13e60 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
13e70 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
13e80 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  al;.        asse
13e90 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13ea0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13eb0 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
13ec0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
13ed0 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
13ee0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13ef0 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
13f00 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
13f10 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
13f20 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
13f30 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
13f40 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
13f50 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
13f60 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
13f70 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
13f80 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13f90 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
13fa0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
13fb0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
13fc0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
13fd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13fe0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13ff0 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
14000 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14010 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14020 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
14030 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
14040 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
14050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14070 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14080 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
14090 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
140a0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
140b0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
140c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
140d0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
140e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
140f0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
14100 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
14110 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
14120 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
14130 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  op;.      explai
14140 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14150 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
14160 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14180 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14190 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
141a0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
141b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
141c0 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74     /* Query flat
141d0 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65  tening in sqlite
141e0 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20  3Select() might 
141f0 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72  refill p->pOrder
14200 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20  By..      ** Be 
14210 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
14220 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
14230 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
14240 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
14250 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
14260 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
14270 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
14280 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
14290 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
142a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
142b0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
142c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
142d0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
142e0 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65  UNION ) p->nSele
142f0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
14300 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
14310 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14320 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
14330 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
14340 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
14350 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14360 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
14370 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
14380 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
14390 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
143a0 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
143b0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
143c0 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
143d0 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
143e0 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
143f0 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
14400 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14410 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
14420 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20  b==dest.iSDParm 
14430 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  || dest.eDest!=p
14440 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20  riorOp );.      
14450 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
14460 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
14470 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
14480 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
14490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
144a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
144b0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
144c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
144d0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
144e0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
144f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14500 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
14510 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
14520 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14530 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
14540 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
14550 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
14560 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
14570 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
14580 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14590 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
145a0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
145b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
145c0 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
145d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
145e0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
145f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14610 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
14620 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
14630 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14640 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
14650 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14660 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
14670 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
14680 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
14690 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
146a0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
146b0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
146c0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
146d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
146e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
146f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
14700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14710 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14720 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
14730 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  b, iStart); Vdbe
14740 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14760 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14770 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
14780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14790 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
147a0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
147b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
147c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
147d0 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d  ault: assert( p-
147e0 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43  >op==TK_INTERSEC
147f0 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74  T ); {.      int
14800 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
14810 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
14820 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
14830 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
14840 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
14850 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14860 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
14870 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
14880 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20    int r1;..     
14890 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
148a0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
148b0 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
148c0 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
148d0 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
148e0 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
148f0 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
14900 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
14910 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
14920 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
14930 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
14940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
14950 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
14960 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
14970 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14980 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14990 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
149a0 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
149b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149c0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
149d0 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
149e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
149f0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14a00 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14a10 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14a20 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
14a30 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
14a40 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
14a50 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
14a60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14a70 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20  p->pEList );..  
14a80 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
14a90 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c  SELECTs to our l
14aa0 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  eft into tempora
14ab0 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e  ry table "tab1".
14ac0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14ad0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
14ae0 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74  tInit(&intersect
14af0 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  dest, SRT_Union,
14b00 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78   tab1);.      ex
14b10 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14b20 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
14b30 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14b40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b50 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14b60 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65  pPrior, &interse
14b70 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ctdest);.      i
14b80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14b90 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14ba0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
14bb0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
14bc0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
14bd0 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
14be0 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
14bf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
14c00 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14c10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14c20 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
14c30 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14c40 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
14c50 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
14c60 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14c70 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
14c80 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
14c90 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
14ca0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14cb0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14cc0 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
14cd0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
14ce0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65   = 0;.      inte
14d00 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
14d10 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
14d20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14d30 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14d40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14d50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14d60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14d70 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64  , p, &intersectd
14d80 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14d90 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14da0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14db0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14dc0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14dd0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14de0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
14df0 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  Row>pPrior->nSel
14e00 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
14e10 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
14e20 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
14e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
14e40 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
14e50 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
14e60 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
14e70 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14e80 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20  = pOffset;..    
14e90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14ea0 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
14eb0 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
14ec0 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
14ed0 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
14ee0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14ef0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14f00 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
14f10 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
14f20 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
14f30 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
14f40 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68   = p;.        wh
14f50 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
14f60 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
14f70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
14f80 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
14f90 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14fa0 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
14fb0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
14fc0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
14fd0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14fe0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
14ff0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
15000 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15010 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
15020 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15030 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
15040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15060 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b  nd, tab1, iBreak
15070 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15080 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  v);.      r1 = s
15090 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
150a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
150b0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
150c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
150d0 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72  _RowKey, tab1, r
150e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
150f0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15100 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15110 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15120 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15130 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15140 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15150 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15160 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15170 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15180 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
151b0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
151c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
151d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
151e0 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
151f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15200 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15210 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15220 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15230 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15240 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15250 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15270 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15280 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
152a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
152b0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
152c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
152d0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
152e0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
152f0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
15300 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
15310 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
15320 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15330 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
15340 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15350 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
15360 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
15370 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
15380 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
15390 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
153a0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
153b0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
153c0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
153d0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
153e0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
153f0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
15400 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15410 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
15420 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
15430 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
15440 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
15450 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
15460 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
15470 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
15480 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
15490 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
154a0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
154b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
154c0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
154d0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
154e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15500 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15510 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
15520 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
15530 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
15540 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
15550 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
15560 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
15570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15580 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
15590 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
155a0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
155b0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
155c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
155d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
155e0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
155f0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
15600 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15620 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
15630 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
15640 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
15650 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
15660 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
15670 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
15680 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
15690 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
156a0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
156b0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
156c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
156d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
156e0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
156f0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
15700 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
15710 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
15720 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
15730 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
15740 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
15750 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
15760 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
15770 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
15780 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
15790 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
157a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
157b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
157c0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
157d0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
157e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
157f0 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
15800 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
15810 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
15820 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
15830 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
15840 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
15850 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
15860 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
15870 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
15880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
15890 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
158a0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
158b0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
158c0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
158d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
158e0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
158f0 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
15900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
15920 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15930 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
15940 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15950 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
15960 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
15970 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
15980 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
159b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
159c0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
159d0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
159e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
159f0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
15a00 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
15a10 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15a20 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
15a30 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
15a40 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
15a50 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
15a60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
15a70 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
15a80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
15a90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15aa0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
15ab0 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
15ac0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
15ad0 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
15ae0 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
15af0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
15b00 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
15b10 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
15b20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15b30 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
15b40 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
15b50 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
15b60 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
15b70 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
15b80 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
15b90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15ba0 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
15bb0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
15bc0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
15bd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15be0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15bf0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
15c00 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
15c10 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
15c20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
15c30 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
15c40 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
15c50 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
15c60 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
15c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
15c80 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
15c90 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
15ca0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
15cb0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
15cc0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
15cd0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
15ce0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
15cf0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
15d00 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
15d10 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
15d20 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
15d30 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
15d40 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
15d50 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
15d60 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
15d70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15d80 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
15d90 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
15da0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
15db0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
15dc0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
15dd0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
15de0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
15df0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
15e00 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
15e10 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
15e20 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
15e30 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
15e40 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
15e50 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
15e60 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
15e70 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
15e80 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
15e90 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
15ea0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
15eb0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
15ec0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
15ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
15ee0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
15ef0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
15f00 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
15f10 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
15f20 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15f30 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
15f40 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
15f50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15f60 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15f70 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15f80 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15f90 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15fa0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
15fb0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
15fc0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
15fd0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
15fe0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
15ff0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
16000 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
16010 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
16020 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
16030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16040 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
16050 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
16060 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
16070 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
16080 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
16090 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
160a0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
160b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
160c0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
160d0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
160e0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
160f0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
16100 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
16110 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
16120 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
16130 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16140 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
16150 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
16160 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
16170 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16180 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
16190 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
161a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
161b0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
161c0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
161d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
161e0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
161f0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
16200 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
16210 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
16220 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16230 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16240 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
16250 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16260 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16270 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16280 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
16290 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
162a0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, 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 20 20 20 28 63 68               (ch
162d0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
162e0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
162f0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16310 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
16320 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
16330 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
16340 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16360 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16380 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
16390 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
163a0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
163b0 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
163c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
163d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
163e0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
163f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
16400 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
16410 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
16420 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
16430 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
16440 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
16450 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
16460 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
16470 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
16480 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
16490 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
164a0 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
164b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
164c0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
164d0 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
164e0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
164f0 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
16500 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
16510 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
16520 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
16530 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
16540 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
16550 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16570 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
16580 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16590 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
165a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
165b0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
165c0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
165d0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
165e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
165f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16600 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
16610 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
16620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16630 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
16640 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
16650 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
16660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16670 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16680 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
16690 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
166a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
166b0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
166c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
166d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
166e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
166f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16700 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
16710 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
16720 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
16730 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
16740 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
16750 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
16760 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
16770 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
16780 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
16790 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
167a0 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
167b0 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
167c0 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
167d0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
167e0 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
167f0 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
16800 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
16810 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
16820 30 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  0 );.      pDest
16830 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
16840 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
16850 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
16860 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
16870 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
16880 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
16890 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
168a0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
168b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168c0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
168d0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
168e0 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
168f0 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
16900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16910 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
16920 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16930 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
16940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16950 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
16960 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16970 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
16980 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16990 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
169a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
169b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
169c0 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
169d0 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
169e0 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
169f0 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
16a00 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16a10 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
16a20 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
16a30 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
16a40 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
16a50 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
16a60 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
16a70 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
16a80 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
16a90 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
16aa0 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
16ab0 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
16ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16ad0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
16ae0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
16af0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
16b00 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
16b10 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
16b20 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
16b30 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
16b40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16b50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
16b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b70 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
16b80 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
16b90 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
16ba0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
16bb0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
16bc0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
16bd0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
16be0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
16bf0 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
16c00 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
16c10 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
16c20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
16c30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
16c40 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
16c50 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
16c60 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
16c70 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
16c80 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
16c90 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
16ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16cb0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
16cc0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
16cd0 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
16ce0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16d00 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
16d10 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
16d20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16d30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
16d40 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
16d50 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
16d60 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
16d70 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
16d80 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
16d90 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
16da0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
16db0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
16dc0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
16dd0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
16de0 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
16df0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
16e00 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
16e10 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
16e20 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
16e30 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
16e40 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
16e50 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
16e60 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
16e70 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
16e80 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
16e90 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
16ea0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
16eb0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
16ec0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
16ed0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
16ee0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
16ef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16f00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16f10 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
16f20 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16f30 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16f40 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
16f50 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
16f60 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16f70 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16f80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16f90 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
16fa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
16fb0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
16fc0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
16fd0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
16fe0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16ff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17000 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
17010 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
17020 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17030 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
17040 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
17050 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
17060 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
17070 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
17080 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
17090 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
170a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
170b0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
170c0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
170d0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
170e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
170f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
17100 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
17110 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
17120 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
17130 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
17140 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
17150 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
17160 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
17170 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
17180 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
17190 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
171a0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
171b0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
171c0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
171d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
171e0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
171f0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
17200 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
17210 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
17220 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17230 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
17240 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
17250 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
17260 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
17270 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
17280 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
17290 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
172a0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
172b0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
172c0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
172d0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
172e0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
172f0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
17300 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
17310 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
17320 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
17330 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
17340 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
17350 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
17360 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
17370 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
17380 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
17390 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
173a0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
173b0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
173c0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
173d0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
173e0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
173f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
17400 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
17410 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
17420 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
17430 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
17440 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
17450 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
17460 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
17470 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
17480 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17490 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
174a0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
174b0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
174c0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
174d0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
174e0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
174f0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
17500 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
17510 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
17520 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
17530 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
17540 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
17550 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
17560 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
17570 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
17580 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
17590 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
175a0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
175b0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
175c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
175d0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
175e0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
175f0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
17600 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17610 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
17620 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
17630 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
17640 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
17650 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
17660 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
17670 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
17680 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17690 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
176a0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
176b0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
176c0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
176d0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
176e0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
176f0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
17700 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
17710 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17720 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
17730 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
17740 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
17750 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
17760 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
17770 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
17780 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
17790 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
177a0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
177b0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
177c0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
177d0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
177e0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
177f0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
17800 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
17810 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17820 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17830 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
17840 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
17850 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
17860 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
17870 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
17880 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
17890 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
178a0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
178b0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
178c0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
178d0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
178e0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
178f0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
17900 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
17910 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
17920 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
17930 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
17940 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
17950 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
17960 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
17970 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
17980 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
17990 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
179a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
179b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
179c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
179d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
179e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
179f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
17a00 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
17a10 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
17a20 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
17a30 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
17a40 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
17a50 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
17a60 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
17a70 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
17a80 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
17a90 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
17aa0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
17ab0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
17ac0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
17ad0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
17ae0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
17af0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
17b00 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
17b10 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
17b20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
17b30 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
17b40 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
17b50 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
17b60 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
17b70 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
17b80 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
17b90 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
17ba0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
17bb0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
17bc0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
17bd0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
17be0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
17bf0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
17c00 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
17c10 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
17c20 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
17c30 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
17c40 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
17c50 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
17c60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17c70 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
17c80 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
17c90 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
17ca0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
17cb0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17cc0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
17cd0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
17ce0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
17cf0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
17d00 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
17d10 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
17d20 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
17d30 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
17d40 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
17d50 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
17d60 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
17d70 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
17d80 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
17d90 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
17da0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
17db0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
17dc0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
17dd0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
17de0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
17df0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
17e00 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
17e10 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
17e20 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
17e30 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
17e40 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
17e50 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
17e60 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
17e70 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
17e80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17e90 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17ea0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
17eb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17ec0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
17ed0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
17ee0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
17ef0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
17f00 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
17f10 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
17f20 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
17f30 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
17f40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17f50 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
17f60 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
17f70 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
17f80 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
17f90 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
17fa0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
17fb0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17fc0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
17fd0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17fe0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
17ff0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
18000 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
18010 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
18020 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
18030 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
18040 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
18050 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
18060 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
18070 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
18080 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18090 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
180a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
180b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
180c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
180d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
180e0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
180f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18100 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
18110 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
18120 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
18130 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18140 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
18150 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
18160 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
18170 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
18180 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
18190 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
181a0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
181b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
181c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
181d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
181e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
181f0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
18200 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18210 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
18220 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
18230 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
18240 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18250 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
18260 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18270 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
18280 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18290 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
182a0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
182b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
182c0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
182d0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
182e0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
182f0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
18300 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
18310 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18320 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18330 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
18340 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18350 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
18360 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18370 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
18380 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
18390 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
183a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
183b0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
183c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
183d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
183e0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
183f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18400 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
18410 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
18420 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18430 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
18440 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
18450 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18460 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18470 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
18480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
18490 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
184a0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
184b0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
184c0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
184d0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
184e0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
184f0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
18500 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
18510 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
18520 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
18530 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
18540 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
18550 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18560 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
18570 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
18580 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
18590 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
185a0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
185b0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
185c0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
185d0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
185e0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
185f0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
18600 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18620 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
18630 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
18640 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
18650 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
18660 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
18670 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
18680 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
18690 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
186a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
186b0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
186c0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
186d0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
186e0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
186f0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
18700 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
18710 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
18720 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
18730 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
18740 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
18750 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
18760 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
18770 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
18780 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
18790 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
187a0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
187b0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
187c0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
187d0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
187e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
187f0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
18800 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
18810 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
18820 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
18830 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
18840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
18850 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
18860 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
18870 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
18880 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
18890 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
188a0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
188b0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
188c0 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
188d0 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
188e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
188f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18900 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
18910 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
18920 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
18930 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
18940 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
18950 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
18960 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18970 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
18980 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18990 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
189a0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
189b0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
189c0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
189d0 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
189e0 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
189f0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
18a00 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
18a10 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
18a20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
18a30 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
18a40 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
18a50 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
18a60 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
18a70 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
18a80 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
18a90 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
18aa0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18ab0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
18ac0 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
18ad0 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
18ae0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
18af0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18b00 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
18b10 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
18b20 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
18b30 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
18b40 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
18b50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
18b60 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
18b70 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18b80 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
18b90 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
18ba0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
18bb0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
18bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
18bd0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18be0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
18bf0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
18c00 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18c10 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
18c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18c30 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
18c40 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
18c50 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
18c60 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
18c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
18c80 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
18c90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18ca0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
18cb0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
18cc0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
18cd0 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
18ce0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
18cf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18d00 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
18d10 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
18d20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
18d30 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
18d40 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
18d50 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
18d60 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
18d70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18d80 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
18d90 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
18da0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
18db0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
18dc0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
18dd0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
18de0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
18df0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
18e00 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
18e10 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
18e20 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
18e30 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
18e40 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
18e50 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18e60 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
18e70 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
18e80 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
18e90 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
18ea0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
18eb0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
18ec0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
18ed0 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
18ee0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
18ef0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
18f00 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
18f10 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
18f20 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
18f30 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18f40 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
18f50 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
18f60 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
18f70 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
18f80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
18f90 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18fa0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
18fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18fc0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18fd0 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
18fe0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
18ff0 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
19000 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
19010 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
19020 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
19030 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
19040 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
19050 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
19060 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
19070 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
19080 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
19090 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
190a0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
190b0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
190c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
190d0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
190e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
190f0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
19100 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
19110 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
19120 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
19130 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
19140 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
19150 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
19160 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
19170 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
19180 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
19190 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
191a0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
191b0 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
191c0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
191d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
191e0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
191f0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
19200 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
19210 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
19220 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
19230 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
19240 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
19250 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
19260 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
19270 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
19280 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
19290 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
192a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
192b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
192c0 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
192d0 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
192e0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
192f0 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
19300 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
19310 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19320 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
19330 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
19340 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
19350 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
19360 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
19370 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
19380 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
19390 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
193a0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
193b0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
193c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193d0 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
193e0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
193f0 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
19400 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
19410 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
19420 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
19430 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
19440 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
19450 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
19460 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
19470 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
19480 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
19490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
194a0 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
194b0 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
194c0 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
194d0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
194e0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
194f0 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
19500 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
19510 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
19520 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
19530 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
19540 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
19550 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
19560 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
19570 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
19580 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
19590 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
195a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
195b0 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
195c0 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
195d0 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : 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 20                  
19600 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
19610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19620 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
19630 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
19640 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
19650 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
19660 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
19670 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
19680 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
19690 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
196a0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
196b0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
196c0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
196d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
196e0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
196f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
19700 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
19710 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19720 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
19730 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
19740 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19750 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19760 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
19770 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
19780 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
19790 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
197a0 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
197b0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
197c0 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
197d0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
197e0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
197f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19800 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
19810 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
19820 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
19830 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
19840 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
19850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19860 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
19870 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
19880 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19890 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
198a0 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20  e, regAddrA, 0, 
198b0 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20  addrSelectA);.  
198c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
198d0 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b  "left SELECT"));
198e0 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
198f0 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
19900 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
19910 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
19920 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
19930 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19940 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
19950 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
19960 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19970 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
19980 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
19990 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
199a0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
199b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
199c0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
199d0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
199e0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
199f0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
19a00 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19a10 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19a20 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19a30 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19a40 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
19a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19a60 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
19a70 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
19a80 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
19a90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19aa0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
19ab0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
19ac0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
19ad0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
19ae0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
19af0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
19b00 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
19b10 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
19b20 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
19b30 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
19b40 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
19b50 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
19b60 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
19b70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
19b80 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
19b90 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
19ba0 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
19bb0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
19bc0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19bd0 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
19be0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
19bf0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
19c00 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
19c10 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
19c20 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
19c30 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
19c40 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
19c50 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
19c60 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
19c70 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
19c80 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
19c90 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
19ca0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
19cb0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
19cc0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
19cd0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
19ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19cf0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
19d00 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
19d10 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
19d20 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
19d30 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
19d40 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
19d50 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
19d60 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
19d70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
19d80 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
19d90 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19da0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
19db0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
19dc0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19dd0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19de0 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
19df0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
19e00 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
19e10 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
19e20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
19e30 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
19e40 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
19e50 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
19e60 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
19e70 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
19e80 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
19e90 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
19ea0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19eb0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
19ec0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19ed0 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
19ee0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
19ef0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
19f00 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
19f10 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19f20 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
19f30 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
19f40 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19f50 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
19f60 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
19f70 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
19f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
19f90 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
19fa0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
19fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19fc0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
19fd0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
19fe0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
19ff0 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
1a000 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a010 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
1a020 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1a050 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1a070 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1a080 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1a090 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
1a0a0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a  SelectRow;.  }..
1a0b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a0c0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1a0d0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1a0e0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1a0f0 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1a100 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1a110 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1a120 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1a130 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1a140 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1a150 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1a160 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1a170 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1a180 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1a190 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1a1a0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1a1b0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1a1c0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a1d0 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1a1e0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a1f0 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1a200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a210 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a220 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1a230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a240 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a250 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1a260 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a270 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a280 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1a290 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
1a2a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1a2b0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1a2c0 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
1a2d0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a2e0 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
1a2f0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1a300 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
1a310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a320 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1a330 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
1a340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a350 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a360 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1a370 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1a390 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1a3a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a3b0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1a3c0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
1a3d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a3e0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
1a3f0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1a400 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
1a410 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1a420 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1a430 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
1a440 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
1a450 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
1a460 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1a470 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
1a480 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
1a490 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
1a4a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a4b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1a4c0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1a4d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a4e0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a4f0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1a500 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a510 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a520 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1a530 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a540 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1a550 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a560 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1a570 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a580 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1a590 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1a5a0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1a5b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a5c0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a5d0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1a5e0 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1a5f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a600 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a610 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1a620 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a630 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1a640 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1a650 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1a660 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1a670 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1a680 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1a690 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1a6a0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
1a6b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a6c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a6d0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1a6e0 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1a6f0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1a700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a710 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a720 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a730 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1a740 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1a750 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1a760 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1a770 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a780 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a7a0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1a7b0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1a7c0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1a7d0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1a7e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a7f0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1a800 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1a810 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1a820 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a840 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1a850 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1a860 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1a870 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1a880 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1a890 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a8a0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1a8b0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1a8c0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1a8d0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1a8e0 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1a8f0 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1a900 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1a910 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1a920 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a930 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1a940 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1a950 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1a960 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
1a970 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1a980 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
1a990 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
1a9a0 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
1a9b0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
1a9c0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
1a9d0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
1a9e0 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
1a9f0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1aa00 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
1aa10 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1aa20 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1aa30 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1aa40 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1aa50 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1aa60 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1aa70 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1aa80 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1aa90 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1aaa0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1aab0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1aac0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1aad0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1aae0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1aaf0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1ab00 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1ab10 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1ab20 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1ab30 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1ab40 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1ab50 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1ab60 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1ab70 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1ab80 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1ab90 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1aba0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1abb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1abc0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1abd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1abe0 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
1abf0 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1ac00 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1ac10 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
1ac20 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
1ac30 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1ac40 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1ac50 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
1ac60 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
1ac70 70 72 4c 69 73 74 2a 2c 20 69 6e 74 29 3b 0a 0a  prList*, int);..
1ac80 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1ac90 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1aca0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1acb0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1acc0 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1acd0 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1ace0 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1acf0 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1ad00 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1ad10 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1ad20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1ad30 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1ad40 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1ad50 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1ad60 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1ad70 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1ad80 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1ad90 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1ada0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1adb0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1adc0 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1add0 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1ade0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1adf0 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1ae00 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1ae10 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1ae20 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1ae30 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1ae40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1ae50 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
1ae60 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1ae70 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1ae80 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1ae90 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1aea0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1aeb0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1aec0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1aed0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1aee0 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1aef0 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
1af00 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1af10 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1af20 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
1af30 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1af40 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1af50 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1af60 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1af70 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
1af80 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1af90 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1afa0 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1afb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1afc0 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
1afd0 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
1afe0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
1aff0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1b000 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1b010 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1b020 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
1b030 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1b040 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1b050 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1b060 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1b070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b080 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1b090 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
1b0a0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1b0b0 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
1b0c0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1b0d0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1b0e0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1b0f0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1b100 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1b110 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
1b120 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1b130 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
1b140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b150 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1b160 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
1b170 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
1b180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
1b190 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
1b1a0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1b1b0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
1b1c0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
1b1d0 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1b1e0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1b1f0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
1b200 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
1b210 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1b220 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1b230 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1b240 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b250 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1b260 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b270 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1b280 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1b290 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
1b2a0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  x.pList, iTable,
1b2b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1b2c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
1b2d0 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
1b2e0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1b2f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1b310 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1b320 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
1b330 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1b340 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1b350 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1b360 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1b370 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1b380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1b390 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1b3a0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1b3b0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
1b3c0 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1b3d0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
1b3e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1b3f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1b400 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1b410 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1b420 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1b430 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  pr = substExpr(d
1b440 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
1b450 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
1b460 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
1b470 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1b480 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
1b490 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1b4a0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1b4b0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
1b4c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1b4d0 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1b4e0 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
1b4f0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1b500 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
1b510 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b520 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b530 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
1b540 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
1b550 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b560 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1b570 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1b580 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75    /* Do substitu
1b590 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72  tes on p->pPrior
1b5a0 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63   too */.){.  Src
1b5b0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1b5c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b5d0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1b5e0 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1b5f0 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  turn;.  do{.    
1b600 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b610 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1b620 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b630 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b640 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1b650 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b660 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1b670 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
1b680 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
1b690 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
1b6a0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1b6b0 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
1b6c0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b6d0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
1b6e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b6f0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
1b700 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b710 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1b720 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1b730 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1b740 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1b750 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1b760 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1b770 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b780 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
1b790 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1b7a0 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  List, 1);.      
1b7b0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1b7c0 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1b7d0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1b7e0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
1b7f0 46 75 6e 63 41 72 67 2c 20 69 54 61 62 6c 65 2c  FuncArg, iTable,
1b800 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   pEList);.      
1b810 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1b820 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1b830 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1b840 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1b850 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b860 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b870 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b880 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b890 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b8a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b8b0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1b8c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1b8d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b8e0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1b8f0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1b900 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1b910 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1b920 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1b930 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1b940 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1b950 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1b960 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1b970 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1b980 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1b990 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1b9a0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1b9b0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1b9c0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1b9d0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1b9e0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1b9f0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1ba00 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1ba10 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1ba20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1ba30 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1ba40 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1ba50 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1ba60 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1ba70 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1ba80 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1ba90 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1baa0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1bab0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1bac0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1bad0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1bae0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1baf0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1bb00 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1bb10 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1bb20 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1bb30 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1bb40 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1bb50 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1bb60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bb70 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1bb80 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1bb90 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1bba0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1bbb0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1bbc0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1bbd0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1bbe0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1bbf0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1bc00 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1bc10 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1bc20 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1bc30 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1bc40 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1bc50 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1bc60 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1bc70 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1bc80 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1bc90 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1bca0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1bcb0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1bcc0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1bcd0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1bce0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1bcf0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1bd00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bd10 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1bd20 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1bd30 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1bd40 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1bd50 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1bd60 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1bd70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bd80 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1bd90 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1bda0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bdb0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1bdc0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1bdd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1bde0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1bdf0 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1be00 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1be10 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1be20 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1be30 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1be40 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1be50 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1be60 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1be70 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1be80 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1be90 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1bea0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1beb0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1bec0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1bed0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1bee0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1bef0 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1bf00 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1bf10 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1bf20 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1bf30 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1bf40 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1bf50 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1bf60 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1bf70 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1bf80 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1bf90 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1bfa0 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1bfb0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1bfc0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1bfd0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1bfe0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1bff0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1c000 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1c010 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1c020 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1c030 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1c040 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c050 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c060 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c070 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1c080 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1c090 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1c0a0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1c0b0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1c0c0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1c0d0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1c0e0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1c0f0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1c100 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1c110 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1c120 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1c130 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1c140 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1c150 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1c160 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1c170 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1c180 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1c190 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c1a0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1c1b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c1c0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1c1d0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1c1e0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c1f0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c200 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c210 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c220 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c230 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c240 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c250 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c260 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c270 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c280 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c290 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c2a0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c2b0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c2c0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c2d0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c2e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c2f0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c300 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c310 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64  ery .**        d
1c320 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c330 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  T.".**.**  (11) 
1c340 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c350 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1c360 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
1c370 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1c380 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1c390 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1c3a0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1c3b0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1c3c0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1c3d0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1c3e0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1c3f0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1c400 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1c410 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1c420 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1c430 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c440 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1c450 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1c460 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c470 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1c480 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
1c490 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c4a0 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
1c4b0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
1c4c0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
1c4d0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c4e0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
1c4f0 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
1c500 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
1c510 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
1c520 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
1c530 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
1c540 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c550 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1c560 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c570 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
1c580 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
1c590 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1c5a0 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1c5b0 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1c5c0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1c5d0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1c5e0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1c5f0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1c600 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
1c610 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
1c620 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
1c630 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
1c640 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
1c650 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
1c660 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
1c670 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1c680 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
1c690 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
1c6a0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1c6b0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c6c0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
1c6d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c6e0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
1c6f0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c700 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
1c710 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
1c720 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c730 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  a join.**.**    
1c740 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
1c750 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
1c760 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
1c770 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
1c780 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
1c790 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
1c7a0 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
1c7b0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
1c7c0 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
1c7d0 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
1c7e0 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  ET clauses.  The
1c7f0 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74   subquery cannot
1c800 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   use any compoun
1c810 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1c820 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
1c830 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73  UNION ALL becaus
1c840 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
1c850 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1c860 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76     operators hav
1c870 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53  e an implied DIS
1c880 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64  TINCT which is d
1c890 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20  isallowed by.** 
1c8a0 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69         restricti
1c8b0 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  on (4)..**.**   
1c8c0 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20       Also, each 
1c8d0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65  component of the
1c8e0 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20   sub-query must 
1c8f0 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1c900 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
1c910 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
1c920 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75  ns. This is actu
1c930 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65  ally a requireme
1c940 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f  nt for any compo
1c950 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45  und.**        SE
1c960 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1c970 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65  but all the code
1c980 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61   here does is ma
1c990 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a  ke sure that no.
1c9a0 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28  **        such (
1c9b0 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65  illegal) sub-que
1c9c0 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e  ry is flattened.
1c9d0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1c9e0 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20   detect the.**  
1c9f0 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72        syntax err
1ca00 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  or and return a 
1ca10 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65  detailed message
1ca20 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
1ca30 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1ca40 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1ca50 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
1ca60 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
1ca70 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
1ca80 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
1ca90 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
1caa0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
1cab0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
1cac0 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
1cad0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
1cae0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1caf0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1cb00 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1cb10 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1cb20 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1cb30 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1cb40 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1cb50 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1cb60 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1cb70 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1cb80 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1cb90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1cba0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1cbb0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1cbc0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1cbd0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1cbe0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1cbf0 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1cc00 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1cc10 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1cc20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1cc30 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1cc40 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1cc50 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1cc60 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1cc70 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1cc80 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1cc90 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1cca0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1ccb0 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (21)  The subque
1ccc0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1ccd0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1cce0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1ccf0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cd00 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1cd10 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1cd20 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1cd30 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cd40 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cd50 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54  ..**.**  (23)  T
1cd60 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74  he parent is not
1cd70 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cd80 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65  , or the sub-que
1cd90 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20  ry is not a.**  
1cda0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71        compound q
1cdb0 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72  uery. This restr
1cdc0 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1cdd0 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1cde0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1cdf0 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1ce00 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1ce10 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1ce20 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1ce30 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1ce40 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1ce50 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29  t()..**.**  (24)
1ce60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1ce70 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1ce80 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
1ce90 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
1cea0 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
1ceb0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
1cec0 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
1ced0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
1cee0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
1cef0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
1cf00 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
1cf10 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
1cf20 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
1cf30 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
1cf40 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
1cf50 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
1cf60 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
1cf70 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1cf80 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1cf90 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1cfa0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1cfb0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1cfc0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1cfd0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1cfe0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1cff0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1d000 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1d010 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1d020 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1d030 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1d040 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1d050 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1d060 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1d070 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1d080 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1d090 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1d0a0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1d0b0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1d0c0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1d0d0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1d0e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d0f0 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1d100 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1d110 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1d120 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1d130 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1d140 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1d150 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1d160 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1d170 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1d180 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1d190 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1d1a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1d1b0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1d1c0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1d1d0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1d1e0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1d1f0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1d200 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1d210 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1d220 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1d230 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d240 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1d250 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d260 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1d270 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1d280 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d290 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d2a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d2b0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1d2c0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1d2d0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1d2e0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1d2f0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1d300 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ent;    /* Curre
1d310 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72  nt UNION ALL ter
1d320 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71  m of the other q
1d330 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74  uery */.  Select
1d340 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d350 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d360 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d370 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d380 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d390 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d3a0 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d3b0 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d3c0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d3d0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d3e0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d3f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d400 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d410 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d420 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d430 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d440 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d450 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d460 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d470 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d480 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d490 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d4a0 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d4b0 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d4c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d4e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d4f0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d520 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d530 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d540 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d550 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d560 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d570 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d580 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d590 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d5a0 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d5b0 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d5c0 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d5e0 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d5f0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d600 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d610 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d620 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d630 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d640 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d650 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d660 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d670 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d680 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d690 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d6a0 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d6b0 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d6c0 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d6d0 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d6e0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d6f0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d700 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d710 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1d720 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
1d730 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d760 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a  triction (1)   *
1d770 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1d780 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1d790 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d7b0 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20  striction (2a)  
1d7c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
1d7d0 57 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73  Where && ExprHas
1d7e0 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65  Property(p->pWhe
1d7f0 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29  re,EP_Subquery))
1d800 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  .     || (sqlite
1d810 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70  3ExprListFlags(p
1d820 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53  ->pEList) & EP_S
1d830 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20  ubquery)!=0.    
1d840 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1d850 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72  ListFlags(p->pOr
1d860 64 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71  derBy) & EP_Subq
1d870 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a  uery)!=0.    ){.
1d880 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 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 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d8c0 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f  riction (2b)  */
1d8d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a  .    }.  }.    .
1d8e0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1d8f0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1d900 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
1d910 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
1d920 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
1d930 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1d940 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
1d950 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
1d960 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
1d970 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
1d980 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1d990 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1d9a0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1d9b0 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1d9c0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1d9d0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1d9e0 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1d9f0 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1da00 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1da10 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1da20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1da30 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1da40 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1da50 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1da60 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1da70 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1da80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1da90 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1daa0 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1dab0 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
1dac0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1daf0 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1db00 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1db10 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1db20 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1db30 20 20 20 72 65 74 75 72 6e 20 30 3b 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 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1db70 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1db80 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1db90 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1dba0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dbc0 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1dbd0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1dbe0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1dbf0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1dc00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1dc10 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
1dc20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1dc30 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1dc40 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1dc50 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1dc60 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1dc70 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1dc80 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1dc90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dca0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
1dcb0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1dcc0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dce0 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1dcf0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1dd00 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
1dd10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1dd20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 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 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dd60 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
1dd70 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
1dd80 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
1dd90 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dda0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ddb0 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
1ddc0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1ddd0 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
1dde0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ddf0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1de00 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
1de10 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1de20 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
1de30 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1de40 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
1de50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1de60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
1de70 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63  ) */.  }.  testc
1de80 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1de90 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1dea0 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ve );.  testcase
1deb0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1dec0 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20   & SF_MinMaxAgg 
1ded0 29 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  );.  if( pSub->s
1dee0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
1def0 63 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61  cursive|SF_MinMa
1df00 78 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74  xAgg) ){.    ret
1df10 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1df20 63 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20  ctions (22) and 
1df30 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (24) */.  }.  if
1df40 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1df50 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26   SF_Recursive) &
1df60 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
1df70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1df80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1df90 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  23) */.  }..  /*
1dfa0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1dfb0 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
1dfc0 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
1dfd0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
1dfe0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1dff0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
1e000 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
1e010 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1e020 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
1e030 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
1e040 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
1e050 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1e060 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e070 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1e080 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1e090 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1e0a0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1e0b0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1e0c0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1e0d0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1e0e0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1e0f0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1e100 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1e110 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1e120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
1e130 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
1e140 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1e150 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
1e160 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1e170 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1e180 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
1e190 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1e1a0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1e1b0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1e1c0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
1e1d0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
1e1e0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1e1f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e200 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1e210 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
1e220 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
1e230 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
1e240 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1e250 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1e260 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1e270 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1e280 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
1e290 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
1e2a0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
1e2b0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
1e2c0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
1e2d0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
1e2e0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
1e2f0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
1e300 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
1e310 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
1e320 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
1e330 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
1e340 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
1e350 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
1e360 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
1e370 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
1e380 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
1e390 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e3a0 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
1e3b0 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
1e3c0 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
1e3d0 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
1e3e0 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
1e3f0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e400 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1e410 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
1e420 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
1e430 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1e440 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1e450 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1e460 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e470 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1e480 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1e490 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e4a0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1e4b0 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1e4c0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1e4d0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1e4e0 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1e4f0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1e500 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1e510 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1e520 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1e530 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1e540 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1e550 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1e560 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1e570 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1e580 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1e590 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1e5a0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1e5b0 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1e5c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1e5d0 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1e5e0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1e5f0 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1e600 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1e610 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1e620 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1e630 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1e640 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1e650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e660 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e670 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e680 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1e690 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1e6a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1e6b0 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e6c0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e6d0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1e6e0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1e6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1e700 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1e710 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e720 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
1e730 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1e740 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
1e750 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
1e760 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1e770 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1e780 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
1e790 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1e7a0 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1e7b0 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
1e7c0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1e7d0 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  <1.      ){.    
1e7e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1e800 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1e810 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1e820 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1e830 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1e840 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e850 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1e860 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1e870 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1e880 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1e890 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1e8a0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1e8b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1e8c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e8d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e8e0 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1e8f0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1e900 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1e910 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1e920 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1e930 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1e940 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1e950 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1e980 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1e990 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1e9a0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1e9b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e9c0 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1e9d0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1e9e0 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1e9f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ea00 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1ea10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1ea20 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1ea30 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1ea40 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1ea50 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1ea60 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1ea70 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1ea80 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1ea90 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1eaa0 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1eab0 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1eac0 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1ead0 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1eae0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1eaf0 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1eb00 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1eb10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1eb20 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1eb30 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1eb40 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1eb50 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1eb60 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1eb70 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1eb80 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1eb90 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1eba0 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1ebb0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1ebc0 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1ebd0 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1ebe0 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1ebf0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1ec00 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1ec10 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1ec20 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1ec30 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1ec40 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1ec50 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1ec60 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1ec70 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1ec80 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1ec90 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1eca0 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1ecb0 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1ecc0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1ecd0 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1ece0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1ecf0 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1ed00 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1ed10 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1ed20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1ed30 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1ed40 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1ed50 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1ed60 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1ed70 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1ed80 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1ed90 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1eda0 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1edb0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1edc0 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1edd0 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1ede0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1edf0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1ee00 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1ee10 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1ee20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1ee30 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1ee40 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1ee50 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1ee60 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1ee70 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1ee80 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1ee90 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1eea0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1eeb0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1eec0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1eed0 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1eee0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1eef0 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1ef00 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1ef10 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1ef20 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1ef30 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1ef40 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1ef50 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1ef60 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1ef70 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1ef80 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1ef90 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1efa0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1efb0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1efc0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1efd0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1efe0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1eff0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1f000 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1f010 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1f020 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
1f030 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
1f040 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1f050 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1f060 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1f070 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1f080 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1f090 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1f0a0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1f0b0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1f0c0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1f0d0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1f0e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1f0f0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1f100 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1f110 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1f120 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1f130 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1f140 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1f150 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1f160 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
1f170 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
1f180 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
1f190 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
1f1a0 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
1f1b0 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
1f1c0 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1f1d0 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
1f1e0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1f1f0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1f200 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1f210 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1f220 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1f230 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1f240 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1f250 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1f260 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1f270 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1f280 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1f290 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1f2a0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1f2b0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1f2c0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1f2d0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1f2e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f2f0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1f300 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1f310 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f320 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1f330 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f340 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1f350 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1f360 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1f370 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1f380 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f390 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1f3a0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1f3b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1f3c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1f3d0 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1f3e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f3f0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1f400 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1f410 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1f420 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1f430 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1f440 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1f450 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1f460 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1f470 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1f480 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1f490 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1f4a0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1f4b0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1f4c0 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1f4d0 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1f4e0 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1f4f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1f500 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1f510 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1f520 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1f530 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1f540 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1f550 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1f560 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f570 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f580 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f590 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f5a0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1f5b0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f5c0 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1f5d0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f5e0 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1f5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f600 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1f610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1f620 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1f630 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1f640 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1f650 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1f660 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1f670 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1f680 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1f690 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1f6a0 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1f6b0 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1f6c0 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1f6d0 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1f6e0 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1f6f0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f700 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1f710 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1f720 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1f730 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1f740 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1f750 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1f760 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1f770 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1f780 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1f790 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1f7a0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1f7b0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1f7c0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1f7d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1f7e0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1f7f0 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1f800 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1f810 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1f820 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1f830 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1f840 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1f850 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1f860 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1f870 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1f880 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1f890 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1f8a0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1f8b0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1f8c0 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1f8d0 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1f8e0 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1f8f0 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1f900 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1f910 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1f920 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1f930 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1f940 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f950 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1f960 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1f970 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1f980 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1f990 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1f9a0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1f9b0 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1f9c0 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1f9d0 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1f9e0 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1f9f0 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1fa00 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1fa10 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1fa20 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1fa30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fa40 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1fa50 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1fa60 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1fa70 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1fa80 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1fa90 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1faa0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
1fab0 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
1fac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1fad0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1fae0 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1faf0 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1fb00 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1fb10 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1fb20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1fb30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1fb40 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1fb50 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1fb60 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1fb70 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1fb80 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1fb90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fba0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fbb0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1fbc0 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1fbd0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1fbe0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1fbf0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1fc00 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fc10 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1fc20 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1fc30 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1fc40 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1fc50 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1fc60 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1fc70 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1fc80 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1fc90 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1fca0 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1fcb0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1fcc0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1fcd0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1fce0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1fcf0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1fd00 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1fd10 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1fd20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1fd30 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1fd40 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1fd50 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1fd60 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1fd70 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1fd80 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1fd90 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1fda0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1fdb0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1fdc0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
1fdd0 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
1fde0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
1fdf0 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
1fe00 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1fe10 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1fe20 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
1fe30 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
1fe40 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1fe50 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1fe60 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1fe70 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1fe80 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1fe90 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1fea0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1feb0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1fec0 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1fed0 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1fee0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fef0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ff00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ff10 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1ff20 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1ff30 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1ff40 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1ff50 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1ff60 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1ff70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1ff80 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1ff90 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1ffa0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1ffb0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1ffc0 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
1ffd0 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
1ffe0 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
1fff0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
20000 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
20010 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
20020 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
20030 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
20040 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
20050 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
20060 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
20070 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
20080 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
20090 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
200a0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
200b0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
200c0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
200d0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
200e0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
200f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20100 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
20110 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20120 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
20130 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
20140 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
20150 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
20160 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
20170 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20190 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
201a0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
201b0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
201c0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
201d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
201e0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
201f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20200 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
20210 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
20220 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
20230 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
20240 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
20250 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
20260 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
20270 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
20280 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
20290 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
202a0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
202b0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
202c0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
202d0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
202e0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
202f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20300 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
20310 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
20320 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
20330 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20340 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
20350 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
20360 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
20370 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
20380 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
20390 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
203a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
203b0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
203c0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
203d0 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
203e0 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
203f0 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
20400 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
20410 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
20420 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
20430 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
20440 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
20450 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
20460 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
20470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20480 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
20490 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
204a0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
204b0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
204c0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
204d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
204e0 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
204f0 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
20500 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
20510 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20520 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
20530 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
20540 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
20550 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
20560 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
20570 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
20580 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
20590 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
205a0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
205b0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
205c0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
205d0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
205e0 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
205f0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
20600 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
20610 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
20620 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
20630 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
20640 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
20650 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
20660 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
20670 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
20680 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
20690 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
206a0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
206b0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
206c0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
206d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
206e0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
206f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
20700 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
20710 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
20720 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
20730 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
20740 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
20750 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
20760 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
20770 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
20780 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
20790 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
207a0 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
207b0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
207c0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
207d0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
207e0 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
207f0 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
20800 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
20810 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
20820 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
20830 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
20840 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
20850 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20880 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
20890 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
208a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
208b0 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
208c0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
208d0 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
208e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
208f0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
20900 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
20910 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
20920 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
20930 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
20940 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
20950 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20  pWhere);.    }. 
20960 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
20970 62 2c 20 70 50 61 72 65 6e 74 2c 20 69 50 61 72  b, pParent, iPar
20980 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20990 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  t, 0);.  .    /*
209a0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
209b0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
209c0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
209d0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
209e0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
209f0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
20a00 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
20a10 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
20a20 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
20a30 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
20a40 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
20a50 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
20a60 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
20a70 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
20a80 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
20a90 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
20aa0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
20ab0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
20ac0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
20ad0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
20ae0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
20af0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
20b00 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
20b10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20b20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
20b30 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20b40 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
20b50 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
20b60 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
20b70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20b80 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
20b90 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
20ba0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
20bb0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
20bc0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
20bd0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
20be0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
20bf0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
20c00 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
20c10 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
20c20 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
20c30 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
20c40 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
20c50 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
20c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
20c70 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
20c80 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
20c90 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
20ca0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
20cb0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20cc0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
20cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20ce0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69  T_VIEW) */....#i
20cf0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
20d00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20d10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20d20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
20d30 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73  *.** Make copies
20d40 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45   of relevant WHE
20d50 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
20d60 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20d70 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57  ry into.** the W
20d80 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73  HERE clause of s
20d90 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c  ubquery.  Exampl
20da0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e:.**.**    SELE
20db0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20dc0 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
20dd0 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   y FROM t1) WHER
20de0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
20df0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  **.** Transforme
20e00 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  d into:.**.**   
20e10 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
20e20 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
20e30 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  -d AS y FROM t1 
20e40 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d  WHERE a=5 AND c-
20e50 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45  d=10).**     WHE
20e60 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
20e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20  .**.** The hope 
20e80 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  is that the term
20e90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
20ea0 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20  nner query will 
20eb0 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20  make it more.** 
20ec0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
20ed0 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
20ee0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
20ef0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  n if:.**.**   (1
20f00 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
20f10 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
20f20 65 2e 20 20 28 49 6e 20 74 68 61 74 20 63 61 73  e.  (In that cas
20f30 65 2c 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77  e, we'd really w
20f40 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ant.**       to 
20f50 63 6f 70 79 20 74 68 65 20 6f 75 74 65 72 20 57  copy the outer W
20f60 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
20f70 73 20 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e  s onto the HAVIN
20f80 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a  G clause of the.
20f90 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71  **       inner q
20fa0 75 65 72 79 2e 20 20 42 75 74 20 74 68 65 79 20  uery.  But they 
20fb0 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68  probably won't h
20fc0 65 6c 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20  elp there so do 
20fd0 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a  not bother.).**.
20fe0 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
20ff0 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
21000 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
21010 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
21020 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
21030 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
21040 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
21050 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
21060 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
21070 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
21080 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64       close would
21090 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
210a0 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
210b0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
210c0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
210d0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
210e0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
210f0 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72  IN.  (The caller
21100 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63  .**       enforc
21110 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63 74  es this restrict
21120 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72  ion since this r
21130 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
21140 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20  have enough.**  
21150 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
21160 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a   to know.).**.**
21170 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
21180 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
21190 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
211a0 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
211b0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
211c0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
211d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
211e0 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  if no changes ar
211f0 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a  e made and non-z
21200 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f  ero if one or mo
21210 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  re WHERE clause.
21220 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70  ** terms are dup
21230 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65  licated into the
21240 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
21250 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77  atic int pushDow
21260 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 73  nWhereTerms(.  s
21270 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
21280 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21290 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
212a0 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a  (for malloc()) *
212b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
212c0 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
212d0 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
212e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
212f0 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
21300 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
21310 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
21320 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
21330 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
21340 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
21350 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
21360 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
21370 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
21380 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
21390 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20  ;.  int nChng = 
213a0 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d  0;.  if( pWhere=
213b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
213c0 20 69 66 28 20 28 70 53 75 62 71 2d 3e 73 65 6c   if( (pSubq->sel
213d0 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72  Flags & (SF_Aggr
213e0 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69  egate|SF_Recursi
213f0 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ve))!=0 ){.     
21400 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21410 74 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e  trictions (1) an
21420 64 20 28 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  d (2) */.  }.  i
21430 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
21440 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
21450 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
21460 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
21470 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
21480 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
21490 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
214a0 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64  DownWhereTerms(d
214b0 62 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  b, pSubq, pWhere
214c0 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
214d0 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
214e0 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
214f0 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
21500 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
21510 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
21520 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
21530 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  triction 5 */.  
21540 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
21550 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
21560 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
21570 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
21580 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
21590 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
215a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
215b0 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
215c0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62        pNew = sub
215d0 73 74 45 78 70 72 28 64 62 2c 20 70 4e 65 77 2c  stExpr(db, pNew,
215e0 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71 2d   iCursor, pSubq-
215f0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
21600 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20  pSubq->pWhere = 
21610 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21620 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
21630 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
21640 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50  Subq = pSubq->pP
21650 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rior;.    }.  }.
21660 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a    return nChng;.
21670 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
21680 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21690 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
216a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
216b0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
216c0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
216d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
216e0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
216f0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
21700 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
21710 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
21720 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
21730 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21740 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
21750 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
21760 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
21770 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
21780 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
21790 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
217a0 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
217b0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
217c0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
217d0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
217e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
217f0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
21800 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
21810 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
21820 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
21830 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
21840 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
21850 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
21860 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
21870 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
21880 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
21890 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
218a0 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
218b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
218c0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
218d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
218e0 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
218f0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
21900 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
21910 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
21920 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
21930 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
21940 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21950 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
21960 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
21970 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
21980 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
21990 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
219a0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
219b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
219c0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
219d0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
219e0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
219f0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
21a00 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
21a10 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
21a20 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
21a30 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
21a40 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21a50 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
21a60 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
21a70 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
21a80 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
21a90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
21aa0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
21ab0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
21ac0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
21ad0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
21ae0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
21af0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
21b00 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
21b10 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
21b20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
21b30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
21b40 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
21b50 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
21b60 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
21b70 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
21b80 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
21b90 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
21ba0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
21bb0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
21bc0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
21bd0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
21be0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
21bf0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
21c00 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
21c10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
21c20 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
21c30 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
21c40 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
21c50 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
21c60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
21c70 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
21c80 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
21c90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
21ca0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
21cb0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
21cc0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
21cd0 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
21ce0 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
21cf0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
21d00 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
21d10 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
21d20 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
21d30 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
21d40 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
21d50 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
21d60 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
21d70 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
21d80 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
21d90 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
21da0 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
21db0 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
21dc0 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
21dd0 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
21de0 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
21df0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
21e00 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
21e10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
21e20 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
21e30 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
21e40 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
21e50 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
21e60 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
21e70 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
21e80 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
21e90 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
21ea0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
21eb0 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
21ec0 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
21ed0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
21ee0 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
21ef0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
21f00 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
21f10 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
21f20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
21f30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
21f40 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
21f50 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
21f60 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
21f70 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
21f80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
21f90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
21fa0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
21fb0 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
21fc0 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
21fd0 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
21fe0 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
21ff0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
22000 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
22010 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
22020 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22030 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
22040 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
22050 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
22060 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
22070 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
22080 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
22090 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
220a0 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
220b0 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
220c0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
220d0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
220e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
220f0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
22100 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
22110 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
22120 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
22130 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
22140 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
22150 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
22160 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
22170 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
22180 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
22190 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
221a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
221b0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
221c0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
221d0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
221e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
221f0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
22200 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
22210 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
22220 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
22230 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22240 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65  .    char *zInde
22250 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75  xedBy = pFrom->u
22260 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20  1.zIndexedBy;.  
22270 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
22280 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
22290 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
222a0 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
222b0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
222c0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42  zName, zIndexedB
222d0 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  y); .        pId
222e0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
222f0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
22300 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
22310 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22320 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
22330 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65  ex: %s", zIndexe
22340 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dBy, 0);.      p
22350 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
22360 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
22370 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22380 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
22390 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  om->pIBIndex = p
223a0 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
223b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
223c0 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
223d0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
223e0 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
223f0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
22400 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
22410 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
22420 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
22430 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
22440 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
22450 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
22460 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
22470 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
22480 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
22490 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
224a0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
224b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
224c0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
224d0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
224e0 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
224f0 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
22500 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
22510 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22520 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
22530 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
22540 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
22550 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
22560 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
22570 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
22580 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
22590 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
225a0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
225b0 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
225c0 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
225d0 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
225e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
225f0 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
22600 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
22610 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
22620 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
22630 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
22640 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
22650 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
22660 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
22670 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
22680 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
22690 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
226a0 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
226b0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
226c0 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
226d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
226e0 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
226f0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
22700 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
22710 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
22720 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
22730 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
22740 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
22750 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
22760 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
22770 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
22780 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
22790 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
227a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
227b0 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
227c0 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
227d0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
227e0 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
227f0 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
22800 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
22810 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
22820 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
22830 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22840 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
22850 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
22860 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
22870 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
22880 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
22890 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
228a0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
228b0 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
228c0 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
228d0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
228e0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
228f0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
22900 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
22910 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
22920 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
22930 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
22940 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
22950 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
22960 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
22970 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
22980 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
22990 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
229a0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
229b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
229c0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
229d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
229e0 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
229f0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
22a00 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
22a10 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
22a20 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
22a30 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
22a40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
22a50 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
22a60 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
22a70 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
22a80 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
22a90 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
22aa0 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
22ab0 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
22ac0 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
22ad0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
22ae0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
22af0 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
22b00 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52  xpr(db, TK_ASTER
22b10 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f  ISK, 0));.  p->o
22b20 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
22b30 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
22b40 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
22b50 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48   = 0;.  pNew->pH
22b60 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65  aving = 0;.  pNe
22b70 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  w->pOrderBy = 0;
22b80 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
22b90 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30  ;.  p->pNext = 0
22ba0 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30  ;.  p->pWith = 0
22bb0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
22bc0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
22bd0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
22be0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
22bf0 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20  verted)==0 );.  
22c00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22c10 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61  F_Converted;.  a
22c20 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72  ssert( pNew->pPr
22c30 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  ior!=0 );.  pNew
22c40 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
22c50 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
22c60 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  pLimit = 0;.  pN
22c70 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ew->pOffset = 0;
22c80 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
22c90 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
22ca0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22cb0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22cc0 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20   term pFrom has 
22cd0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
22ce0 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e  ction.** argumen
22cf0 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ts.  If it does,
22d00 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
22d10 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
22d20 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  e and return.** 
22d30 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20  non-zero, since 
22d40 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c  pFrom is not all
22d50 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62  owed to be a tab
22d60 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le-valued functi
22d70 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
22d80 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  t cannotBeFuncti
22d90 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
22da0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
22db0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
22dc0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
22dd0 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
22de0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22df0 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73  pParse, "'%s' is
22e00 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22   not a function"
22e10 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pFrom->zName);
22e20 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
22e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22e40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22e50 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
22e60 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
22e70 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
22e80 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
22e90 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
22ea0 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
22eb0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
22ec0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
22ed0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
22ee0 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
22ef0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
22f00 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
22f10 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
22f20 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
22f30 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
22f40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22f50 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
22f60 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
22f70 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
22f80 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
22f90 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
22fa0 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
22fb0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
22fc0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
22fd0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
22fe0 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
22ff0 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
23000 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
23010 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
23020 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
23030 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
23040 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23050 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49  ent innermost WI
23060 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
23070 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23080 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
23090 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
230a0 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
230b0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
230c0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
230d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
230e0 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
230f0 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
23100 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
23110 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
23120 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
23130 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
23140 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
23150 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
23160 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
23170 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
23180 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
23190 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
231a0 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
231b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
231c0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
231d0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
231e0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
231f0 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
23200 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
23210 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
23220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23230 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23240 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
23250 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
23260 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
23270 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
23280 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
23290 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
232a0 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
232b0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
232c0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
232d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
232e0 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
232f0 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
23300 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23310 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
23320 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
23330 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
23340 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
23350 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
23360 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
23370 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
23380 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
23390 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
233a0 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
233b0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
233c0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
233d0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
233e0 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
233f0 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
23400 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
23410 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
23420 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
23430 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
23440 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
23450 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
23460 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
23470 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
23480 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
23490 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
234a0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d  (pParse->pWith==
234b0 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69  0 && pParse->pWi
234c0 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a  thToFree==0) );.
234d0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
234e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
234f0 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20  e->pWith!=pWith 
23500 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  );.    pWith->pO
23510 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
23520 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23530 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
23540 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
23550 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f   pParse->pWithTo
23560 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20  Free = pWith;.  
23570 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
23580 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
23590 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
235a0 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
235b0 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
235c0 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
235d0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
235e0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
235f0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
23600 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
23610 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
23620 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
23630 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
23640 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
23650 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
23660 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
23670 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
23680 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
23690 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
236a0 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
236b0 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
236c0 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
236d0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
236e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
236f0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
23700 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
23710 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
23720 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
23730 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
23740 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
23750 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
23760 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
23770 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23780 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
23790 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
237a0 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
237b0 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
237c0 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
237d0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
237e0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
237f0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
23800 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
23810 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23820 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
23830 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
23840 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
23850 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23860 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
23870 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
23880 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
23890 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
238a0 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
238b0 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
238c0 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
238d0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
238e0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
238f0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23910 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
23920 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
23930 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
23940 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23950 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
23960 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
23970 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
23980 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
23990 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
239a0 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
239b0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
239c0 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
239d0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
23a00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
23a10 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
23a20 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
23a30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
23a40 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
23a50 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
23a60 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
23a70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
23a80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
23a90 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
23aa0 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
23ab0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
23ac0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
23ad0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
23ae0 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
23af0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
23b00 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
23b10 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
23b20 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
23b30 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
23b40 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
23b50 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
23b60 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
23b70 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
23b80 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20  ive reference.. 
23b90 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
23ba0 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f  se, proceed.  */
23bb0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a  .    if( pCte->z
23bc0 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20  CteErr ){.      
23bd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23be0 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43  pParse, pCte->zC
23bf0 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  teErr, pCte->zNa
23c00 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
23c10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23c20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61      }.    if( ca
23c30 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
23c40 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
23c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23c60 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ROR;..    assert
23c70 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
23c80 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70   );.    pFrom->p
23c90 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
23ca0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23cb0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
23cc0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
23cd0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
23ce0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61  C_Abort;.    pTa
23cf0 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
23d00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
23d10 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
23d20 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
23d30 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
23d40 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d   = -1;.    pTab-
23d50 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
23d60 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
23d70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23d80 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54  48576) );.    pT
23d90 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
23da0 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54  TF_Ephemeral | T
23db0 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
23dc0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65  ;.    pFrom->pSe
23dd0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
23de0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65  lectDup(db, pCte
23df0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
23e00 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23e10 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
23e20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23e30 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
23e40 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20  ->pSelect );..  
23e50 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
23e60 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76  is is a recursiv
23e70 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53  e CTE. */.    pS
23e80 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
23e90 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63  ect;.    bMayRec
23ea0 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d  ursive = ( pSel-
23eb0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
23ec0 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
23ed0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  N );.    if( bMa
23ee0 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
23ef0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
23f00 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
23f10 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d   pFrom->pSelect-
23f20 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72  >pSrc;.      for
23f30 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
23f40 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
23f50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23f60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
23f70 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
23f80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
23f90 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20  Database==0 .   
23fa0 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
23fb0 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20  zName!=0 .      
23fc0 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
23fd0 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a  StrICmp(pItem->z
23fe0 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  Name, pCte->zNam
23ff0 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  e).          ){.
24000 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
24010 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
24020 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66          pItem->f
24030 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  g.isRecursive = 
24040 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
24050 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
24060 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
24070 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
24080 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
24090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
240a0 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
240b0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
240c0 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
240d0 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
240e0 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  ->nRef>2 ){.    
240f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24100 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
24110 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
24120 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
24130 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
24140 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
24150 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
24160 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
24170 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
24180 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ert( pTab->nRef=
24190 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
241a0 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
241b0 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52  ive) && pTab->nR
241c0 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
241d0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
241e0 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
241f0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
24200 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
24210 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
24220 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24230 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  th;.    sqlite3W
24240 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
24250 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  r, bMayRecursive
24260 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20   ? pSel->pPrior 
24270 3a 20 70 53 65 6c 29 3b 0a 20 20 20 20 70 50 61  : pSel);.    pPa
24280 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24290 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65  th;..    for(pLe
242a0 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e  ft=pSel; pLeft->
242b0 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c  pPrior; pLeft=pL
242c0 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  eft->pPrior);.  
242d0 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74    pEList = pLeft
242e0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66  ->pEList;.    if
242f0 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b  ( pCte->pCols ){
24300 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
24310 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
24320 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
24330 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
24340 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24350 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
24360 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
24370 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
24380 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
24390 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
243a0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
243b0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
243c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
243d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
243e0 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
243f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24400 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
24410 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
24420 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
24430 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
24440 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
24450 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
24460 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
24470 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
24480 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
24490 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
244a0 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
244b0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
244c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
244d0 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74  >zCteErr = "mult
244e0 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
244f0 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
24500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24510 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
24520 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
24530 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
24540 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
24550 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
24560 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
24570 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
24580 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43    }.    pCte->zC
24590 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
245a0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
245b0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
245c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
245d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
245e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
245f0 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
24600 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
24610 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
24620 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
24630 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
24640 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
24650 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
24660 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
24670 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
24680 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
24690 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
246a0 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
246b0 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
246c0 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
246d0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
246e0 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
246f0 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
24700 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
24710 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
24720 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
24730 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
24740 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
24750 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
24760 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
24770 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
24780 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
24790 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  e;.  With *pWith
247a0 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
247b0 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66  (p)->pWith;.  if
247c0 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
247d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
247e0 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
247f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
24800 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
24810 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ter;.  }.}.#else
24820 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
24830 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
24840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
24850 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
24860 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
24870 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
24880 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
24890 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
248a0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
248b0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
248c0 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
248d0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
248e0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
248f0 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
24900 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
24910 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
24920 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
24930 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
24940 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
24950 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
24960 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
24970 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
24980 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
24990 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
249a0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
249b0 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
249c0 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
249d0 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
249e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
249f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
24a00 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
24a10 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
24a20 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
24a30 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
24a40 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
24a50 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
24a60 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
24a70 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
24a80 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
24a90 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
24aa0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
24ab0 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
24ac0 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
24ad0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
24ae0 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
24af0 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
24b00 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
24b10 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
24b20 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
24b30 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
24b40 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
24b50 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
24b60 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
24b70 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
24b80 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
24b90 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
24ba0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
24bb0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
24bc0 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
24bd0 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
24be0 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
24bf0 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
24c00 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
24c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
24c20 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
24c30 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
24c40 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
24c50 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
24c60 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
24c70 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
24c80 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
24c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
24ca0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
24cb0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
24cc0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
24cd0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
24ce0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
24cf0 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
24d00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
24d10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
24d20 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
24d30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24d40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24d50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24d60 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
24d70 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
24d80 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
24d90 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
24da0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
24db0 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
24dc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
24dd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
24de0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
24df0 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
24e00 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
24e10 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
24e20 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
24e30 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
24e40 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
24e50 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
24e60 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
24e70 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c  f( pWalker->xSel
24e80 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65  ectCallback2==se
24e90 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20  lectPopWith ){. 
24ea0 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75     sqlite3WithPu
24eb0 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52  sh(pParse, findR
24ec0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
24ed0 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  th, 0);.  }..  /
24ee0 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
24ef0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
24f00 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
24f10 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
24f20 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
24f30 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
24f40 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
24f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
24f60 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
24f70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
24f80 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
24f90 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
24fa0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
24fb0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
24fc0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
24fd0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
24fe0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
24ff0 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
25000 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
25010 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
25020 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
25030 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
25040 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
25050 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
25060 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
25070 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
25080 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
25090 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
250a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
250b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
250c0 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
250d0 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e  ve==0 || pFrom->
250e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
250f0 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52  f( pFrom->fg.isR
25100 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
25110 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
25120 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
25130 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
25140 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
25150 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
25160 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
25170 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25180 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
25190 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
251a0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
251b0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
251c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
251d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
251e0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
251f0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
25200 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
25210 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
25220 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
25230 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
25240 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
25250 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
25260 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
25270 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
25280 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25290 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29  pWalker, pSel) )
252a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
252b0 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  t;.      pFrom->
252c0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
252d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
252e0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
252f0 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
25300 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
25310 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
25320 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
25330 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
25340 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
25350 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
25360 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
25370 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
25380 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
25390 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
253a0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
253b0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
253c0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
253d0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
253e0 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
253f0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
25400 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
25410 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
25420 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
25430 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
25440 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
25450 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
25460 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
25470 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
25480 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
25490 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
254a0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
254b0 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
254c0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
254d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
254e0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
254f0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
25500 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
25510 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
25520 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
25530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
25540 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
25550 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
25560 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30  f( pTab->nRef==0
25570 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
25580 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25590 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
255a0 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
255b0 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
255c0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
255d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
255e0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
255f0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
25600 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
25620 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
25630 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
25640 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
25650 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
25660 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
25670 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
25680 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
25690 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
256a0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
256b0 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
256c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
256d0 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
256e0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
256f0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
25700 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
25710 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nCol;.        if
25720 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
25730 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
25740 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
25750 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
25770 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
25780 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
25790 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
257a0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
257b0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
257c0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
257d0 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
257e0 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pFrom->pSelect,
257f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
25800 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54         nCol = pT
25810 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
25820 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d    pTab->nCol = -
25830 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
25840 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
25850 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
25860 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
25870 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Tab->nCol = nCol
25880 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
25890 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
258a0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
258b0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
258c0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
258d0 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
258e0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
258f0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
25900 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
25910 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25920 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
25930 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
25940 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
25950 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
25960 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
25970 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
25980 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
25990 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
259a0 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
259b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
259c0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
259d0 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
259e0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
259f0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
25a00 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
25a10 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
25a20 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
25a30 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
25a40 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
25a50 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
25a60 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
25a70 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
25a80 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
25a90 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
25aa0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
25ab0 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72  TK_ASTERISK oper
25ac0 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
25ad0 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
25ae0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  in the column.  
25af0 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f  ** list.  The fo
25b00 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
25b10 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
25b20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a  the TK_ASTERISK.
25b30 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
25b40 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68   and expand each
25b50 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
25b60 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
25b70 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c  in.  ** all tabl
25b80 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
25b90 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
25ba0 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
25bb0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
25bc0 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
25bd0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
25be0 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
25bf0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
25c00 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
25c10 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
25c20 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
25c30 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
25c40 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
25c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
25c60 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25c70 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
25c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
25c90 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
25ca0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
25cb0 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
25cc0 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
25cd0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
25ce0 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
25cf0 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
25d00 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
25d10 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
25d20 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
25d30 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
25d40 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
25d50 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
25d60 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
25d70 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
25d80 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
25d90 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
25da0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
25db0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
25dc0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
25dd0 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
25de0 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
25df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
25e00 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
25e10 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
25e20 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
25e30 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
25e40 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
25e50 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
25e60 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
25e70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25e80 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
25e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ea0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
25eb0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
25ec0 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
25ed0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
25ee0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
25ef0 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
25f00 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
25f10 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
25f20 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
25f30 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
25f40 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
25f50 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
25f60 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
25f70 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
25f80 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
25f90 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
25fa0 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
25fb0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
25fc0 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
25fd0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
25fe0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
25ff0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26000 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
26010 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
26020 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
26030 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
26040 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
26050 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
26060 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
26070 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
26080 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
26090 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
260a0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
260b0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
260c0 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
260d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
260e0 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
260f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26100 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
26110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26120 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
26130 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
26140 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
26150 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
26160 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
26170 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
26180 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
26190 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
261a0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
261b0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
261c0 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
261d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
261e0 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
261f0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
26200 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
26210 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
26220 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
26230 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
26240 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26250 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
26260 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
26270 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
26280 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
26290 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
262a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
262b0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
262c0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
262d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
262e0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
262f0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
26300 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
26310 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
26320 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
26330 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
26340 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
26350 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
26360 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
26370 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
26380 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
26390 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
263a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
263b0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
263c0 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
263d0 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
263e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
263f0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
26400 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
26410 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
26420 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
26430 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
26440 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
26450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
26460 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
26470 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
26480 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
26490 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
264a0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
264b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
264c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
264d0 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
264e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
264f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
26500 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
26510 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
26520 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
26530 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
26540 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
26550 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
26560 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
26570 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
26580 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
26590 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
265a0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
265b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
265c0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
265d0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
265e0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
265f0 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
26600 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
26610 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
26620 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
26630 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
26640 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
26650 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
26660 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
26670 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
26680 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
26690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
266a0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
266c0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
266d0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
266e0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
266f0 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
26700 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
26720 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
26730 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
26740 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
26750 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
26760 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
26770 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
26780 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
26790 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
267a0 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
267b0 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
267c0 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
267d0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
267e0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
267f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
26800 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
26810 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
26820 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
26830 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
26840 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
26850 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
26860 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26870 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26880 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26890 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
268a0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
268b0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
268c0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
268d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
268e0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
268f0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
26900 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
26910 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
26920 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
26930 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
26940 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
26950 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
26960 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
26970 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
26980 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
26990 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
269a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
269b0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
269c0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
269f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a00 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
26a10 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
26a20 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
26a30 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
26a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26a50 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
26a60 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
26a70 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
26a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a90 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
26aa0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
26ab0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
26ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ad0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
26ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b00 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
26b10 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
26b20 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
26b30 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
26b40 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
26b50 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
26b60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
26b70 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
26b80 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
26b90 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
26ba0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
26bc0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
26bd0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
26be0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
26bf0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
26c00 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
26c10 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
26c20 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
26c30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26c40 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26c60 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
26c70 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
26c80 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
26c90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
26ca0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
26cb0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
26cc0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
26cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26ce0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
26cf0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
26d00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26d10 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
26d20 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
26d30 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
26d40 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
26d50 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
26d60 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
26d80 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
26d90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26da0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
26db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26dc0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
26dd0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26de0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
26df0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
26e00 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
26e10 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
26e20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
26e30 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
26e40 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
26e50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26e60 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
26e70 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
26e80 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
26e90 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
26ea0 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
26eb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
26ec0 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
26ee0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
26ef0 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
26f00 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
26f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26f20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
26f30 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
26f40 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
26f50 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
26f60 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
26f70 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
26f80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26f90 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
26fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26fc0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
26fd0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26fe0 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
26ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
27020 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
27030 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
27050 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
27060 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
27070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27080 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
27090 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
270a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
270b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
270c0 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
270d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
270e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
270f0 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
27100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
27110 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
27120 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27130 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
27140 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
27150 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
27160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27180 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27190 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
271a0 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
271b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
271c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
271d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
271e0 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
271f0 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
27200 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
27210 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
27220 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
27230 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
27240 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
27250 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
27260 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
27270 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
27280 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
27290 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
272a0 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
272b0 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
272c0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
272d0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
272e0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
272f0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
27300 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
27310 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
27320 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
27330 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
27340 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
27350 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
27360 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
27370 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
27380 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
27390 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
273a0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
273b0 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
273c0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
273d0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
273e0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
273f0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
27400 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
27410 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
27420 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
27430 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
27440 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
27450 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
27460 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
27470 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
27480 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
27490 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
274a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
274b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
274c0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
274d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
274e0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
274f0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
27500 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
27510 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
27520 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
27530 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
27540 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
27550 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
27560 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
27570 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
27580 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
27590 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
275a0 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
275b0 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
275c0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
275d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
275e0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
275f0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
27600 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
27610 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
27620 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
27630 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
27640 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
27650 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
27660 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
27670 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
27680 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
27690 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
276a0 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
276b0 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
276c0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
276d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
276e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
276f0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
27700 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
27710 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
27720 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
27730 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
27740 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
27750 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
27760 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
27770 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
27780 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
27790 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
277a0 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
277b0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
277c0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
277d0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
277e0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
277f0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27800 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
27810 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
27820 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
27830 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d  .  if( (pSelect-
27840 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
27850 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  ultiValue)==0 ){
27860 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
27870 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
27880 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73  PopWith;.  }.  s
27890 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
278a0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
278b0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
278c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
278d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
278e0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
278f0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
27900 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
27910 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
27920 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
27930 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
27940 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
27950 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
27960 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
27970 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
27980 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
27990 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
279a0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
279b0 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
279c0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
279d0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
279e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
279f0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27a00 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
27a10 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
27a20 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
27a30 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
27a40 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
27a50 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
27a60 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
27a70 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
27a80 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
27a90 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
27aa0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
27ab0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
27ac0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
27ad0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27ae0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
27af0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
27b00 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
27b10 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
27b20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
27b30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
27b40 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
27b50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27b60 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
27b70 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
27b80 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
27b90 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
27ba0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27bb0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
27bc0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
27bd0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
27be0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
27bf0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
27c00 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
27c10 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
27c20 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
27c30 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
27c40 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
27c50 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
27c60 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27c70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
27c80 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
27c90 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
27ca0 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
27cb0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
27cc0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
27cd0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27ce0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
27cf0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
27d00 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
27d10 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
27d20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
27d30 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
27d40 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
27d50 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
27d60 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75     selectAddColu
27d70 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
27d80 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
27d90 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
27da0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
27db0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
27dc0 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
27dd0 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
27de0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
27df0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
27e00 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
27e10 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
27e20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
27e30 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
27e40 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
27e50 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
27e60 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
27e70 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27e80 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
27e90 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
27ea0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
27eb0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
27ec0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
27ed0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27ee0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
27ef0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27f00 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
27f10 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
27f20 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
27f30 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
27f40 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
27f50 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
27f60 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
27f70 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
27f80 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
27f90 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
27fa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
27fb0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
27fc0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27fd0 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
27fe0 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
27ff0 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
28000 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
28010 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
28020 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
28030 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
28040 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
28050 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
28060 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
28070 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
28080 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
28090 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
280a0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
280b0 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
280c0 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
280d0 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
280e0 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
280f0 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
28100 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
28110 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
28120 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
28130 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
28140 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
28150 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
28160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
28170 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
28180 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
28190 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
281a0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
281b0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
281c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
281d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
281e0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
281f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
28200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28210 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28220 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
28230 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
28240 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
28250 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
28260 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
28270 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
28280 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
28290 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
282a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
282b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
282c0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
282d0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
282e0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
282f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
28300 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
28310 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
28320 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
28330 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
28340 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
28350 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
28360 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
28370 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
28380 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
28390 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
283a0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
283b0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
283c0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
283d0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
283e0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
283f0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
28400 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
28410 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
28420 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
28430 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
28440 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
28450 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
28460 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
28470 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
28480 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
28490 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
284a0 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
284b0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
284c0 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
284d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
284e0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
284f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
28500 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
28510 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
28520 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28530 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
28540 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
28550 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
28560 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
28570 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
28580 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
28590 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
285a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
285b0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
285c0 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
285d0 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
285e0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
285f0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
28600 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
28610 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
28620 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
28630 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
28640 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
28650 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
28660 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
28670 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
28680 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
28690 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
286a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
286b0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
286c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
286d0 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
286e0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
286f0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
28700 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
28710 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
28720 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
28730 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
28740 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
28750 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
28760 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
28770 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
28780 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
28790 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
287a0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
287b0 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
287c0 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
287d0 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
287e0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
287f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28800 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
28810 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
28820 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
28830 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
28840 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
28850 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
28860 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
28870 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
28890 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
288a0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
288b0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
288c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
288d0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
288e0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
288f0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
28900 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
28910 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
28920 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
28930 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
28940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28950 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
28960 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
28970 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28980 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
28990 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
289a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
289b0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
289c0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
289d0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
28a00 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
28a10 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
28a20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
28a30 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
28a40 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
28a50 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
28a60 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
28a70 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
28a80 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
28a90 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
28aa0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
28ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
28ac0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
28ad0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
28ae0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
28af0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
28b00 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
28b10 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
28b20 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
28b30 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28b40 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
28b50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
28b60 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
28b70 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
28b80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28b90 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
28ba0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
28bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28bc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
28bd0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
28be0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
28bf0 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
28c20 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
28c30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28c40 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
28c50 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
28c60 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
28c70 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
28c80 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
28c90 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
28ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
28cb0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
28cc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
28cd0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28ce0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28cf0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
28d00 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
28d10 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
28d20 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
28d30 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
28d40 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
28d50 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
28d60 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
28d70 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
28d80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
28d90 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
28da0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
28db0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
28dc0 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
28dd0 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
28de0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
28df0 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
28e00 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
28e10 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
28e20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
28e30 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
28e40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
28e50 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
28e60 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
28e70 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
28e80 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
28e90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
28ea0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
28eb0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
28ec0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
28ed0 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
28ee0 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49   regAgg, 0, SQLI
28ef0 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
28f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
28f10 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
28f20 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
28f30 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
28f40 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
28f50 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
28f60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28f70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
28f80 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29  tcase( nArg==0 )
28f90 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64  ;  /* Error cond
28fa0 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74  ition */.      t
28fb0 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20  estcase( nArg>1 
28fc0 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20  );   /* Also an 
28fd0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63  error */.      c
28fe0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
28ff0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
29000 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
29010 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
29020 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
29030 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
29040 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
29050 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
29060 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
29070 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
29080 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
29090 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
290a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
290b0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
290c0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
290d0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
290e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
290f0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
29100 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
29110 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
29120 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
29130 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
29140 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
29150 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
29160 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29170 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
29180 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
29190 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
291a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
291b0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
291c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
291d0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
291e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
291f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29200 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29210 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
29220 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
29230 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
29240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29250 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
29260 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30  , OP_AggStep0, 0
29270 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
29280 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
29290 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
292a0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
292b0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
292c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
292d0 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
292e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
292f0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
29300 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
29310 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
29320 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
29330 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
29340 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
29350 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
29360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29370 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
29380 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
29390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
293a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
293b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
293c0 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
293d0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
293e0 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
293f0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
29400 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
29410 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
29420 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
29430 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
29440 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
29450 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
29460 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
29470 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
29480 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
29490 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
294a0 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
294b0 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
294c0 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
294d0 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
294e0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
294f0 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
29500 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
29510 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
29520 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
29530 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
29540 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
29550 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
29560 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
29570 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
29580 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
29590 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
295a0 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
295b0 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
295c0 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
295d0 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
295e0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
295f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29600 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
29610 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
29620 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
29630 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
29640 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
29650 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
29660 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
29670 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
29680 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
29690 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
296a0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
296b0 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
296c0 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
296d0 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
296e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
296f0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29700 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73    if( addrHitTes
29710 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
29720 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
29730 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20  addrHitTest);.  
29740 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
29750 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
29760 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
29770 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
29780 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
29790 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
297a0 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
297b0 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
297c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
297d0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
297e0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
297f0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
29800 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29820 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
29830 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
29840 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
29850 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
29860 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
29870 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
298a0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
298b0 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
298c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
298d0 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
298e0 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70   int bCover = (p
298f0 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f  Idx!=0 && (HasRo
29900 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
29910 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
29920 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61  pIdx)));.    cha
29930 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65  r *zEqp = sqlite
29940 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
29950 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  >db, "SCAN TABLE
29960 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
29970 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
29980 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
29990 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
299a0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
299b0 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
299c0 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
299d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
299e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
299f0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
29a00 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
29a10 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
29a20 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
29a30 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
29a40 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
29a50 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
29a60 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
29a70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
29a80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
29a90 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
29aa0 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
29ab0 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
29ac0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
29ad0 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  lts are returned
29ae0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
29af0 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
29b00 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63  ucture..** See c
29b10 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74  omments in sqlit
29b20 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68  eInt.h for furth
29b30 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  er information..
29b40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29b50 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
29b60 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
29b70 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
29b80 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
29b90 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
29ba0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
29bb0 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
29bc0 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
29bd0 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
29be0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
29bf0 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
29c00 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
29c10 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
29c20 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
29c30 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
29c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
29c50 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
29c60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29c70 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
29c80 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
29c90 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
29ca0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
29cb0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
29cc0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
29cd0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
29ce0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
29cf0 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
29d00 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
29d10 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
29d20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
29d30 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
29d40 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
29d50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
29d60 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
29d70 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
29d80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
29d90 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
29da0 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
29db0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
29dc0 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
29dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29de0 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
29df0 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
29e00 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
29e10 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a  *pEList = 0;  /*
29e20 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
29e30 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
29e40 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
29e50 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
29e60 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
29e70 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
29e80 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
29e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
29ea0 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
29eb0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
29ec0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
29ed0 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
29ee0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
29ef0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
29f00 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
29f10 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
29f20 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
29f30 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
29f40 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
29f50 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
29f60 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
29f70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
29f80 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
29f90 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
29fa0 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
29fb0 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
29fc0 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73  d */.  SortCtx s
29fd0 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Sort;         /*
29fe0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
29ff0 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42  code the ORDER B
2a000 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67  Y clause */.  Ag
2a010 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
2a020 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
2a030 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
2a040 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
2a050 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
2a060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2a070 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
2a080 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
2a090 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2a0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a0b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2a0c0 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
2a0d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2a0e0 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
2a0f0 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
2a100 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
2a110 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
2a120 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
2a130 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
2a140 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
2a150 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
2a160 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
2a170 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
2a180 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
2a190 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a1a0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2a1b0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2a1c0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
2a1d0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
2a1e0 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
2a1f0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
2a200 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
2a210 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2a220 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  ED.  pParse->nSe
2a230 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20  lectIndent++;.  
2a240 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2a250 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20  arse,p, ("begin 
2a260 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29  processing:\n"))
2a270 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
2a280 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2a290 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
2a2a0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2a2b0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2a2c0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2a2d0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2a2e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2a2f0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
2a300 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a310 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a320 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69  t->eDest!=SRT_Fi
2a330 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
2a340 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2a350 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2a360 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
2a370 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a380 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a390 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51  st->eDest!=SRT_Q
2a3a0 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67  ueue );.  if( Ig
2a3b0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2a3c0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
2a3d0 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
2a3e0 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
2a3f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a400 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
2a410 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2a420 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
2a430 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a440 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a  =SRT_Discard ||.
2a450 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a460 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65  ->eDest==SRT_Que
2a470 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ue  || pDest->eD
2a480 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
2a490 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  o ||.           
2a4a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a4b0 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70  T_DistQueue || p
2a4c0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a4d0 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49  _Fifo);.    /* I
2a4e0 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
2a4f0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
2a500 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
2a510 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
2a520 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
2a530 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
2a540 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
2a550 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2a560 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
2a570 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
2a580 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2a590 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2a5a0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2a5b0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
2a5c0 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
2a5d0 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73   0);.  memset(&s
2a5e0 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Sort, 0, sizeof(
2a5f0 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74  sSort));.  sSort
2a600 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2a610 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c  OrderBy;.  pTabL
2a620 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2a630 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2a640 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2a650 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2a660 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a670 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2a680 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73  EList!=0 );.  is
2a690 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
2a6a0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2a6b0 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43  e)!=0;.#if SELEC
2a6c0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2a6d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2a6e0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2a6f0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2a700 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2a710 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20  p, ("after name 
2a720 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29  resolution:\n"))
2a730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2a740 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2a750 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2a760 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ...  /* If writi
2a770 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
2a780 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
2a790 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
2a7a0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
2a7b0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
2a7c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a7d0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
2a7e0 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
2a7f0 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
2a800 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
2a810 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2a820 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
2a830 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
2a840 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74  ndif..  /* Try t
2a850 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
2a860 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2a870 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20   clause up into 
2a880 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20  the main query. 
2a890 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
2a8a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
2a8b0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
2a8c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2a8d0 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
2a8e0 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
2a8f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2a900 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2a910 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a920 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2a930 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2a940 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2a950 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2a960 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20  nt isAggSub;.   
2a970 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2a980 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2a990 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
2a9a0 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2a9b0 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69  Catch mismatch i
2a9c0 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63  n the declared c
2a9d0 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77  olumns of a view
2a9e0 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
2a9f0 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  of.    ** column
2aa00 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
2aa10 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  on the RHS */.  
2aa20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
2aa30 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  !=pSub->pEList->
2aa40 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
2aa50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2aa60 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64  Parse, "expected
2aa70 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20   %d columns for 
2aa80 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22  '%s' but got %d"
2aa90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2aaa0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
2aab0 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  ol, pTab->zName,
2aac0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
2aad0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74  Expr);.      got
2aae0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2aaf0 20 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75    }..    isAggSu
2ab00 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
2ab10 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2ab20 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
2ab30 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
2ab40 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
2ab50 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
2ab60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2ab70 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
2ab80 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
2ab90 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
2aba0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
2abb0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
2abc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
2abd0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2abe0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
2abf0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
2ac00 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
2ac10 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2ac20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2ac30 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2ac40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2ac50 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
2ac60 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
2ac70 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
2ac80 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2ac90 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
2aca0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  dif..  /* Get a 
2acb0 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45  pointer the VDBE
2acc0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2acd0 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20  ion, allocating 
2ace0 61 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e  a new VDBE if on
2acf0 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  e.  ** does not 
2ad00 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f  already exist */
2ad10 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
2ad20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
2ad30 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
2ad40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69   select_end;..#i
2ad50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ad60 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2ad70 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2ad80 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2ad90 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2ada0 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2adb0 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2adc0 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2add0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2ade0 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2adf0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2ae00 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2ae10 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2ae20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2ae30 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2ae40 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2ae50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2ae60 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2ae70 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2ae80 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2ae90 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2aea0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c      pParse->nSel
2aeb0 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
2aec0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
2aed0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2aee0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2aef0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
2af00 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2af10 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
2af20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2af30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2af40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2af50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2af60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2af70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2af80 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2af90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2afa0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2afb0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
2afc0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
2afd0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2afe0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2aff0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
2b000 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2b010 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
2b020 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
2b030 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
2b040 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
2b050 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
2b060 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
2b070 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
2b080 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
2b090 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
2b0a0 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
2b0b0 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
2b0c0 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
2b0d0 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
2b0e0 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
2b0f0 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
2b100 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
2b110 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
2b120 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
2b130 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
2b140 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
2b150 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
2b160 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
2b170 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
2b180 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
2b190 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
2b1a0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
2b1b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
2b1c0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2b1d0 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
2b1e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b1f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2b200 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b210 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
2b220 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
2b230 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
2b250 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
2b260 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
2b270 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
2b280 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
2b290 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
2b2a0 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
2b2b0 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
2b2c0 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
2b2d0 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
2b2e0 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
2b2f0 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
2b300 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
2b310 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
2b320 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
2b330 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
2b340 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
2b350 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
2b360 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
2b370 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
2b380 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
2b390 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
2b3a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
2b3b0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
2b3c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2b3d0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
2b3e0 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    /* Make copies
2b3f0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45   of constant WHE
2b400 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE-clause terms 
2b410 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
2b420 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69  ry down.    ** i
2b430 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65  nside the subque
2b440 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65  ry.  This can he
2b450 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20  lp the subquery 
2b460 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69  to run more effi
2b470 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ciently..    */.
2b480 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2b490 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2b4a0 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20  _OUTER)==0.     
2b4b0 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  && pushDownWhere
2b4c0 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20  Terms(db, pSub, 
2b4d0 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2b4e0 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29  ->iCursor).    )
2b4f0 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2b500 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2b510 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2b520 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2b530 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2b540 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2b550 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2b560 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2b570 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2b580 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2b590 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2b5a0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2b5b0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
2b5c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2b5d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
2b5e0 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20  ubquery.    */. 
2b5f0 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
2b600 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 26 26  >nSrc==1.     &&
2b610 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2b620 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20  SF_All)==0.     
2b630 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2b640 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2b650 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2b660 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2b670 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
2b680 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2b690 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
2b6a0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2b6b0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2b6c0 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
2b6d0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
2b6e0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
2b6f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2b700 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
2b710 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b720 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2b730 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2b740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2b750 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2b760 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2b770 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2b780 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2b790 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2b7a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2b7b0 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
2b7c0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2b7d0 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
2b7e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2b7f0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2b800 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
2b810 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2b820 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2b830 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2b840 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2b850 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2b860 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2b870 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2b880 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2b890 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2b8a0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
2b8b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
2b8c0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
2b8d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2b8e0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2b8f0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2b900 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2b910 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2b920 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b930 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
2b940 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2b950 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2b960 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2b970 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2b980 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2b990 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2b9a0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2b9b0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2b9c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2b9d0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2b9e0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2b9f0 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2ba00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2ba10 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2ba20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2ba30 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2ba40 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2ba50 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2ba60 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2ba70 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2ba80 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2ba90 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2baa0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2bab0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2bac0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2bad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2bae0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2baf0 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2bb00 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2bb10 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2bb20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bb30 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
2bb40 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2bb50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2bb60 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
2bb70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2bb80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2bb90 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
2bba0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2bbb0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2bbc0 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
2bbd0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2bbe0 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
2bbf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2bc00 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
2bc10 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
2bc20 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
2bc30 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
2bc40 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
2bc50 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
2bc60 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
2bc70 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2bc80 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2bc90 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
2bca0 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
2bcb0 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
2bcc0 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
2bcd0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2bce0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bcf0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2bd00 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2bd10 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bd20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bd30 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
2bd40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2bd50 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2bd60 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2bd70 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
2bd80 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2bd90 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2bda0 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2bdb0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2bdc0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2bdd0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2bde0 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2bdf0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2be00 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2be10 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2be20 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2be30 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2be40 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2be50 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
2be60 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
2be70 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
2be80 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
2be90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
2bea0 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
2beb0 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
2bec0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2bed0 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
2bee0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2bef0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bf00 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
2bf10 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bf20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bf30 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
2bf40 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
2bf50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2bf60 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2bf70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2bf80 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2bf90 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2bfa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2bfb0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2bfc0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
2bfd0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
2bfe0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2bff0 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
2c000 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
2c010 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
2c020 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
2c030 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
2c040 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
2c050 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
2c060 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2c070 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2c080 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2c090 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2c0a0 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2c0b0 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2c0c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2c0d0 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
2c0e0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2c0f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2c100 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2c110 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2c120 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2c130 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
2c140 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
2c150 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
2c160 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2c170 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2c180 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
2c190 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
2c1a0 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
2c1b0 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
2c1c0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
2c1d0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
2c1e0 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
2c1f0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2c200 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
2c210 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
2c220 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
2c230 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
2c240 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
2c250 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
2c260 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2c270 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
2c280 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
2c290 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
2c2a0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
2c2b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2c2c0 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
2c2d0 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
2c2e0 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2c2f0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
2c300 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
2c310 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
2c320 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
2c330 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
2c340 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
2c350 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
2c360 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
2c370 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
2c380 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
2c390 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
2c3a0 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
2c3b0 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
2c3c0 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
2c3d0 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
2c3e0 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
2c3f0 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
2c400 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2c410 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
2c420 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c430 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
2c440 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
2c450 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
2c460 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2c470 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
2c480 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
2c490 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
2c4a0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2c4b0 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2c4c0 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2c4d0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2c4e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2c4f0 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
2c500 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
2c510 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
2c520 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
2c530 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
2c540 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
2c550 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
2c560 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
2c570 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
2c580 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
2c590 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
2c5a0 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
2c5b0 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
2c5c0 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
2c5d0 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
2c5e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2c5f0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2c600 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2c610 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
2c620 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2c630 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  en create an eph
2c640 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a  emeral index to.
2c650 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74    ** do the sort
2c660 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73  ing.  But this s
2c670 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c  orting ephemeral
2c680 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
2c690 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75   up.  ** being u
2c6a0 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
2c6b0 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  a can be extract
2c6c0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2c6d0 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20   order..  ** If 
2c6e0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2c6f0 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70  , then the OP_Op
2c700 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
2c710 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ruction will be.
2c720 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
2c730 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20  an OP_Noop once 
2c740 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
2c750 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
2c760 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  ndex is.  ** not
2c770 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53   needed.  The sS
2c780 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c790 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  x variable is us
2c7a0 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
2c7b0 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67  .  ** that chang
2c7c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
2c7d0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2c7e0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2c7f0 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
2c800 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2c810 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2c820 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2c830 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , 0, pEList->nEx
2c840 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69  pr);.    sSort.i
2c850 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
2c860 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
2c870 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c880 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
2c890 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2c8a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2c8b0 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
2c8c0 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
2c8d0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2c8e0 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
2c8f0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
2c900 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2c910 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
2c920 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c930 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c940 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
2c950 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
2c960 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
2c970 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
2c980 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
2c990 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
2c9a0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2c9b0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
2c9c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c9d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2c9e0 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
2c9f0 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
2ca00 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
2ca10 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
2ca20 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
2ca30 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2ca40 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
2ca50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c  ->nSelectRow = L
2ca60 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
2ca70 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
2ca80 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
2ca90 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
2caa0 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
2cab0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2cac0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
2cad0 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
2cae0 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
2caf0 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
2cb00 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
2cb10 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
2cb20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
2cb30 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
2cb40 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
2cb50 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
2cb60 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
2cb70 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
2cb80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2cb90 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2cba0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2cbb0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2cbc0 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
2cbd0 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
2cbe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2cbf0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2cc00 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
2cc30 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2cc60 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2cc70 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
2cc80 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
2ccb0 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
2ccc0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2ccd0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
2cce0 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
2ccf0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2cd00 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2cd10 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
2cd20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2cd30 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2cd40 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
2cd50 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
2cd60 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
2cd70 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
2cd80 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2cd90 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
2cda0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
2cdb0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
2cdc0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2cdd0 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
2cde0 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
2cdf0 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
2ce00 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
2ce10 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
2ce20 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2ce30 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2ce40 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
2ce50 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
2ce80 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
2ce90 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
2cea0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2ceb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2cec0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2ced0 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2cee0 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2cef0 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2cf00 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2cf10 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2cf20 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2cf30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cf40 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2cf50 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2cf60 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2cf70 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2cf80 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2cf90 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2cfa0 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2cfb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cfc0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2cfd0 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2cfe0 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2cff0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2d000 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2d010 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2d020 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2d030 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2d040 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2d050 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2d060 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2d070 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2d080 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2d090 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2d0a0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2d0b0 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2d0c0 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2d0d0 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2d0e0 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2d0f0 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2d100 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2d110 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2d120 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d130 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2d140 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2d150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d160 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d170 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d180 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2d190 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2d1a0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2d1b0 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2d1c0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2d1d0 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2d1e0 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2d1f0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2d200 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d210 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2d220 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d240 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2d250 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2d260 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2d270 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2d280 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2d290 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d2a0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2d2b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2d2c0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2d2d0 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2d2e0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2d2f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2d300 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2d310 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2d320 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2d330 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2d340 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2d350 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2d360 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2d370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d380 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2d390 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2d3a0 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2d3b0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2d3c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d3d0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2d3e0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2d3f0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2d400 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2d410 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2d420 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2d430 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2d440 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2d450 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2d460 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2d470 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2d480 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2d4b0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2d4c0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2d4d0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2d4e0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2d4f0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2d500 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2d510 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2d520 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2d530 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2d540 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2d550 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2d560 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2d570 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2d580 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2d590 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2d5a0 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2d5b0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2d5c0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2d5d0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2d5e0 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2d5f0 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2d600 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2d610 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
2d620 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
2d630 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
2d640 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
2d650 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
2d660 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2d670 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2d680 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2d690 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2d6a0 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2d6b0 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2d6c0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2d6d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2d700 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2d710 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2d720 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2d730 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2d740 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2d750 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2d760 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2d770 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2d780 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2d790 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2d7a0 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2d7b0 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2d7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2d7d0 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2d7e0 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2d7f0 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2d800 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2d810 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2d820 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2d830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2d840 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
2d850 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2d860 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
2d870 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
2d880 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
2d890 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2d8a0 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
2d8b0 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
2d8c0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
2d8d0 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  hey are.    ** i
2d8e0 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69  dentical, then i
2d8f0 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
2d900 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  e to disable the
2d910 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d920 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20   .    ** on the 
2d930 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65  grounds that the
2d940 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63   GROUP BY will c
2d950 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
2d960 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a   come out .    *
2d970 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
2d980 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20   order. It also 
2d990 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52  may not - the GR
2d9a0 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
2d9b0 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2d9c0 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2d9d0 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2d9e0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2d9f0 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2da00 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2da10 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2da20 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2da30 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2da40 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2da50 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2da60 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2da70 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2da80 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2da90 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2daa0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2dab0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2dac0 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2dad0 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2dae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2daf0 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2db00 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2db10 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2db20 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2db30 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2db40 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2db50 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2db60 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2db70 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2db80 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2db90 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2dba0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2dbb0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2dbc0 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2dbd0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2dbe0 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2dbf0 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2dc00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2dc10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2dc20 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2dc30 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2dc40 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2dc50 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2dc60 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2dc70 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2dc80 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2dc90 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2dca0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2dcb0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2dcc0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2dcd0 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2dce0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
2dcf0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2dd00 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2dd10 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2dd20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2dd30 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2dd40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2dd50 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2dd60 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2dd70 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2dd80 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2dd90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2dda0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2ddb0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2ddc0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2ddd0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2dde0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2ddf0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2de00 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2de10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2de20 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2de30 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2de40 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2de50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2de60 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2de70 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2de80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2de90 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2dea0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2deb0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2dec0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2ded0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2dee0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2def0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2df00 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2df10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2df20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2df30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2df40 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2df50 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2df60 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2df70 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2df80 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2df90 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2dfa0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2dfb0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2dfc0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2dfd0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2dfe0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2dff0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2e000 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2e010 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2e020 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2e030 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20     int addr1;   
2e040 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2e050 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2e060 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2e070 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2e080 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2e090 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2e0a0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2e0b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2e0c0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2e0d0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2e0e0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2e0f0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2e100 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2e110 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2e120 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2e130 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2e140 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2e150 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2e160 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2e170 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2e180 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2e190 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2e1a0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2e1b0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2e1c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2e1d0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2e1e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2e1f0 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2e200 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2e210 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2e220 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2e230 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2e240 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2e250 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2e260 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2e270 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2e280 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2e290 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2e2a0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2e2b0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2e2c0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2e2d0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2e2e0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2e2f0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2e300 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2e310 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2e320 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2e330 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2e340 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2e350 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2e360 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2e370 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2e380 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2e390 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2e3a0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2e3b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2e3c0 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49  roupBy, 0, sAggI
2e3d0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
2e3e0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
2e3f0 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
2e400 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
2e410 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
2e420 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2e430 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
2e440 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2e450 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
2e460 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2e470 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
2e480 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
2e490 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
2e4a0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
2e4b0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
2e4c0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
2e4d0 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
2e4e0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2e4f0 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
2e500 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2e510 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
2e520 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
2e530 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e540 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2e550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2e560 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2e570 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
2e580 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e590 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
2e5a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2e5b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
2e5c0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
2e5d0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
2e5e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
2e5f0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2e600 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
2e610 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2e620 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2e630 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2e640 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
2e650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e660 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2e670 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2e680 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e690 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
2e6a0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2e6b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e6c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2e6d0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2e6e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2e6f0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
2e700 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
2e710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e720 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e730 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c  _Null, 0, iAMem,
2e740 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d   iAMem+pGroupBy-
2e750 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20  >nExpr-1);..    
2e760 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
2e770 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
2e780 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
2e790 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
2e7a0 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
2e7b0 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
2e7c0 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
2e7d0 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
2e7e0 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
2e7f0 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
2e800 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
2e810 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
2e820 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
2e830 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
2e840 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
2e850 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
2e860 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
2e870 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2e880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e890 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2e8a0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2e8b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
2e8c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2e8d0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2e8e0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  st, pWhere, pGro
2e8f0 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20  upBy, 0,.       
2e900 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
2e910 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f   | (orderByGrp ?
2e920 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
2e930 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20  UP : 0), 0.     
2e940 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2e950 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2e960 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
2e970 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2e980 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2e990 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  o)==pGroupBy->nE
2e9a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  xpr ){.        /
2e9b0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
2e9c0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
2e9d0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
2e9e0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
2e9f0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
2ea00 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
2ea10 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
2ea20 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
2ea30 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
2ea40 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
2ea50 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
2ea60 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
2ea70 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
2ea80 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
2ea90 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
2eaa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eab0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
2eac0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
2ead0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
2eae0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
2eaf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
2eb00 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
2eb10 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
2eb20 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
2eb30 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
2eb40 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
2eb50 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2eb60 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
2eb70 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
2eb80 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
2eb90 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2eba0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
2ebb0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
2ebc0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
2ebd0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
2ebe0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
2ebf0 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
2ec00 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2ec10 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2ec20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
2ec30 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
2ec40 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
2ec50 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
2ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
2ec70 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
2ec80 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
2ec90 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
2eca0 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
2ecb0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
2ecc0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
2ecd0 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20  ol = nGroupBy;. 
2ece0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2ecf0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
2ed00 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2ed10 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2ed20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
2ed30 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
2ed40 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
2ed50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
2ed60 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
2ed70 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2ed80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ed90 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
2eda0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2edb0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
2edc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2edd0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ede0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2edf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2ee00 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2ee10 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
2ee20 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ase, 0, 0);.    
2ee30 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2ee40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ee50 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2ee60 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2ee70 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2ee80 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
2ee90 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
2eea0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
2eeb0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2eec0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2eed0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
2eee0 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
2eef0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ef00 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
2ef10 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c  umnToReg(pParse,
2ef20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
2ef50 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
2ef60 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20  ->iTable, r1);. 
2ef70 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2ef80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ef90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2efa0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
2efb0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2efc0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2efd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2efe0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2eff0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
2f000 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2f010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2f030 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
2f040 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
2f050 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2f060 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2f070 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2f080 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2f090 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2f0a0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2f0b0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
2f0c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2f0d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2f0e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
2f0f0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2f100 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
2f110 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2f120 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
2f130 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
2f140 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2f150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f160 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f170 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
2f180 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
2f190 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2f1a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f1b0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
2f1c0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2f1d0 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
2f1e0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2f1f0 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
2f200 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65  BY sort")); Vdbe
2f210 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f220 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
2f230 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
2f240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f250 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2f260 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d  Parse);..      }
2f270 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2f280 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f  e index or tempo
2f290 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20  rary table used 
2f2a0 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  by the GROUP BY 
2f2b0 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  sort.      ** wi
2f2c0 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c  ll naturally del
2f2d0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65  iver rows in the
2f2e0 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20   order required 
2f2f0 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  by the ORDER BY.
2f300 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c        ** clause,
2f310 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65   cancel the ephe
2f320 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e  meral table open
2f330 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a   coded earlier..
2f340 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f350 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
2f360 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
2f370 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
2f380 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
2f390 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  ardless..      *
2f3a0 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
2f3b0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
2f3c0 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
2f3d0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
2f3e0 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64  R to .      ** d
2f3f0 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
2f400 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
2f410 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
2f420 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64  */.      if( ord
2f430 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d  erByGrp && Optim
2f440 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2f450 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  b, SQLITE_GroupB
2f460 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20  yOrder) .       
2f470 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20  && (groupBySort 
2f480 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  || sqlite3WhereI
2f490 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29  sSorted(pWInfo))
2f4a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2f4b0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2f4c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
2f4d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2f4e0 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2f4f0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2f500 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2f510 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
2f520 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2f530 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
2f540 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
2f550 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
2f560 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2f570 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
2f580 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
2f590 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
2f5a0 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
2f5b0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2f5c0 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
2f5d0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
2f5e0 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
2f5f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
2f600 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
2f610 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
2f620 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
2f630 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
2f640 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2f650 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2f660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2f670 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2f680 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
2f690 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2f6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f6b0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
2f6c0 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
2f6d0 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
2f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6f0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73        sortOut, s
2f700 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20  ortPTab);.      
2f710 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2f720 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2f730 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2f740 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2f750 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2f760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f770 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2f780 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2f790 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
2f7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2f7b0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2f7c0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2f7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f7e0 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2f7f0 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2f800 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2f810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f830 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2f840 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2f850 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2f860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f870 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2f880 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2f890 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2f8a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2f8b0 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
2f8c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f8d0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2f8e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f8f0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b   OP_Jump, addr1+
2f900 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20  1, 0, addr1+1); 
2f910 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f920 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2f930 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
2f940 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
2f950 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
2f960 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
2f970 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
2f980 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
2f990 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2f9a0 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
2f9b0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
2f9c0 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
2f9d0 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
2f9e0 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
2f9f0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
2fa00 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
2fa10 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
2fa20 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
2fa30 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
2fa40 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
2fa50 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
2fa60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2fa70 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
2fa80 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
2fa90 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
2faa0 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
2fab0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
2fac0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
2fad0 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
2fae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2faf0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
2fb00 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
2fb10 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
2fb20 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
2fb30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fb40 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2fb50 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2fb60 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2fb70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fb80 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
2fb90 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
2fba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fbb0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
2fbc0 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
2fbd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2fbe0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fbf0 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
2fc00 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2fc10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fc20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2fc30 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2fc40 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
2fc50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fc60 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
2fc70 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2fc80 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
2fc90 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2fca0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
2fcb0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
2fcc0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
2fcd0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
2fce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2fcf0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
2fd00 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2fd10 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2fd20 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2fd30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fd40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2fd50 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2fd60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fd70 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2fd80 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2fd90 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2fda0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2fdb0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2fdc0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2fdd0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2fde0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fdf0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2fe00 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2fe10 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2fe20 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
2fe30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2fe40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fe50 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2fe60 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2fe70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fe80 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2fe90 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2fea0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2feb0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2fec0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2fed0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
2fee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fef0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2ff00 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2ff10 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2ff20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ff30 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2ff40 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2ff50 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2ff60 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2ff70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2ff80 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2ff90 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
2ffa0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2ffb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2ffc0 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
2ffd0 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2ffe0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
2fff0 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
30000 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
30010 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
30020 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
30030 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
30040 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
30050 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
30060 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
30070 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
30080 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
30090 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
300a0 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
300b0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
300c0 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
300d0 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
300e0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
300f0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
30100 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
30110 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
30120 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
30130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
30140 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
30150 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
30160 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
30170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30180 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
30190 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
301a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
301b0 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
301c0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
301d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
301e0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
301f0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
30200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30210 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
30220 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
30230 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
30240 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
30250 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
30260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
30280 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
30290 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
302a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
302b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
302c0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
302d0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
302e0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
302f0 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
30300 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
30310 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
30320 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30330 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
30340 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
30350 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
30360 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
30370 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
30380 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
30390 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
303a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
303b0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
303c0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
303d0 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
303e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
303f0 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e          &sDistin
30400 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30420 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
30430 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
30440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30450 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
30460 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
30470 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
30480 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
30490 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
304a0 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
304b0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
304c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
304d0 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
304e0 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
304f0 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
30500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30510 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30520 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
30530 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
30540 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
30550 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
30560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30570 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
30580 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
30590 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
305a0 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
305b0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
305c0 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
305d0 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
305e0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
305f0 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  *pDel = 0;.#ifnd
30600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
30610 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
30620 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
30630 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
30640 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
30650 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
30660 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
30670 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
30680 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
30690 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
306a0 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
306b0 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
306c0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
306d0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
306e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
306f0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
30700 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
30710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30720 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
30730 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
30740 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
30750 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
30760 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30770 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
30780 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
30790 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
307a0 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
307b0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
307c0 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
307d0 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
307e0 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
307f0 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
30800 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
30810 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
30820 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
30830 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
30840 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
30850 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
30860 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
30870 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
30880 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
30890 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
308a0 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
308b0 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
308c0 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
308d0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
308e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
308f0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
30900 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
30910 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
30920 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
30930 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
30940 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
30950 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
30960 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
30970 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
30980 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
30990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
309a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
309b0 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
309c0 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
309d0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
309f0 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
30a00 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
30a10 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
30a20 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
30a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
30a40 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
30a50 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
30a60 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
30a70 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
30a80 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
30a90 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
30aa0 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
30ab0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
30ac0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
30ad0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
30ae0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
30af0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
30b00 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
30b10 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
30b20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
30b30 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
30b40 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20   has the lowest 
30b50 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20  scan cost..     
30b60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30b70 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
30b80 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
30b90 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
30ba0 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
30bb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30bc0 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f   (2013-10-03) Do
30bd0 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65   not count the e
30be0 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74  ntries in a part
30bf0 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ial index..     
30c00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30c10 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
30c20 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
30c30 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
30c40 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
30c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
30c60 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
30c70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
30c80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30c90 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
30ca0 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73  Tab) ) pBest = s
30cb0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
30cc0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
30cd0 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
30ce0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
30cf0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
30d00 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
30d10 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65  f( pIdx->bUnorde
30d20 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
30d30 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78    && pIdx->szIdx
30d40 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
30d50 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ow.           &&
30d60 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
30d70 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
30d80 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
30d90 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
30da0 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29  pBest->szIdxRow)
30db0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
30dc0 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
30dd0 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
30de0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30df0 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
30e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
30e10 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
30e20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
30e30 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
30e40 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
30e50 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
30e60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
30e70 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
30e80 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
30e90 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
30ea0 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
30eb0 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
30ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
30ed0 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Int(v, OP_OpenRe
30ee0 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
30ef0 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
30f00 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
30f10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30f20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
30f30 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
30f40 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
30f50 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NFO);.        }.
30f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30f70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30f80 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
30f90 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
30fa0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
30fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30fc0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
30fd0 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
30fe0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
30ff0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
31000 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
31010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31020 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
31030 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
31040 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
31050 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
31060 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
31070 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
31080 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31090 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
310a0 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
310b0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
310c0 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
310d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
310e0 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
310f0 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
31100 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
31110 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
31120 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20  results.        
31130 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
31140 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
31150 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
31160 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
31170 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
31180 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
31190 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
311a0 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
311b0 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
311c0 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
311d0 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
311e0 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
311f0 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
31200 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
31210 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
31220 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
31230 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
31240 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
31250 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
31260 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
31270 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
31280 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
31290 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  um .        ** v
312a0 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
312b0 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
312c0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
312d0 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
312e0 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
312f0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
31300 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
31310 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
31320 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
31330 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  vior as follows:
31340 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31350 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
31360 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
31370 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
31380 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
31390 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
313a0 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
313b0 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
313c0 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
313d0 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
313e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
313f0 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
31400 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
31410 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
31420 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
31430 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
31440 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
31450 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
31460 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
31470 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
31480 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
31490 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
314a0 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
314b0 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
314c0 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
314d0 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
314e0 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
314f0 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
31500 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
31510 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
31520 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
31530 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
31540 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
31550 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
31560 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
31570 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
31580 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73      .        ass
31590 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
315a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
315b0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29  ssert( flag==0 )
315c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
315d0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20  >pHaving==0 ){. 
315e0 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
315f0 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67  minMaxQuery(&sAg
31600 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29  gInfo, &pMinMax)
31610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31620 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
31630 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21  ==0 || (pMinMax!
31640 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 && pMinMax->n
31650 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20  Expr==1) );..   
31660 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
31670 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
31680 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
31690 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e  ListDup(db, pMin
316a0 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Max, 0);.       
316b0 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
316c0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
316d0 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
316e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
316f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
31700 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
31710 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
31720 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
31730 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
31740 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
31750 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
31760 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
31770 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
31780 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
31790 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
317a0 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
317b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
317c0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
317d0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
317e0 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
317f0 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
31800 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
31810 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
31820 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
31830 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
31840 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
31850 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
31860 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
31870 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
31880 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
31890 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
318a0 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20  ,0,flag,0);.    
318b0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
318c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
318d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
318e0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
318f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
31900 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
31910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
31920 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
31930 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31940 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31950 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
31960 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
31970 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
31980 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
31990 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e  Ordered(pWInfo)>
319a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
319b0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
319c0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
319d0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
319e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
319f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
31a00 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
31a20 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
31a30 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
31a40 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
31a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31a60 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
31a70 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
31a80 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
31a90 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31aa0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31ab0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
31ac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
31ad0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
31ae0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
31af0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
31b00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
31b10 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
31b20 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
31b30 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
31b40 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
31b50 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
31b60 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
31b70 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
31b80 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31b90 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
31ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31bb0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
31bc0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
31bd0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
31be0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
31bf0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
31c00 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
31c10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
31c20 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
31c30 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
31c40 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
31c50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
31c60 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
31c70 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
31c80 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
31c90 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
31ca0 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
31cb0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
31cc0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
31cd0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
31ce0 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
31cf0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
31d00 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
31d10 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
31d20 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
31d30 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
31d40 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
31d50 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
31d60 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
31d70 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
31d80 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
31d90 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
31da0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
31db0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
31dc0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31dd0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
31de0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
31df0 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e   has been coded.
31e00 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
31e10 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
31e20 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20  se structure,.  
31e30 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72  ** set the retur
31e40 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68  n code to 1. Oth
31e50 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72  erwise 0. */.  r
31e60 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  c = (pParse->nEr
31e70 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74  r>0);..  /* Cont
31e80 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
31e90 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
31ea0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
31eb0 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
31ec0 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
31ed0 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
31ee0 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
31ef0 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
31f00 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
31f10 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
31f20 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
31f30 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
31f40 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
31f50 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
31f60 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
31f70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
31f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31f90 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31fa0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
31fb0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
31fc0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
31fd0 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
31fe0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
31ff0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
32000 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
32010 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
32020 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
32030 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
32040 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
32050 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
32060 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
32070 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  "));.  pParse->n
32080 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
32090 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
320a0 72 63 3b 0a 7d 0a                                rc;.}.