/ Hex Artifact Content
Login

Artifact 3492a2794b8ff04dce2a91a284492df5725045f5:


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 70 53 72 63 2d 3e  g);.      pSrc->
1ffd0 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1ffe0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1fff0 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
20000 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
20010 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
20020 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
20030 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e  rc->a[iFrom].fg.
20040 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
20050 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
20060 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
20070 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
20080 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
20090 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
200a0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
200b0 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
200c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
200d0 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
200e0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
200f0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
20100 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
20110 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
20120 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
20130 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
20140 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
20160 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
20170 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
20180 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
20190 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
201a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
201b0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
201c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
201d0 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
201e0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
201f0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
20200 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
20210 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
20220 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
20230 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
20240 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
20250 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
20260 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
20270 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
20280 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
20290 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
202a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
202b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
202c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
202d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
202e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
202f0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
20300 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
20310 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
20320 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
20330 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
20340 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
20350 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
20360 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
20370 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
20380 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
20390 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
203a0 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65  oint, any non-ze
203b0 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76  ro iOrderByCol v
203c0 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74  alues indicate t
203d0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
203e0 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
203f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
20400 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20  dentical to the 
20410 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20  iOrderByCol'th. 
20420 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
20430 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  on returned by S
20440 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
20450 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73  pSub. Since thes
20460 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a  e values.      *
20470 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61  * do not necessa
20480 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20  rily correspond 
20490 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45  to columns in SE
204a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
204b0 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a  Parent,.      **
204c0 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72   zero them befor
204d0 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68  e transfering th
204e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
204f0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
20500 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74    ** Not doing t
20510 68 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e  his may cause an
20520 20 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73   error if a subs
20530 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74  equent call to t
20540 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
20550 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
20560 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70  o flatten a comp
20570 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
20580 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20  nto pParent.    
20590 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77    ** (the only w
205a0 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ay this can happ
205b0 65 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d  en is if the com
205c0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20  pound sub-query 
205d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  is.      ** curr
205e0 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53  ently part of pS
205f0 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74  ub->pSrc). See t
20600 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38  icket [d11a6e908
20610 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78  f].  */.      Ex
20620 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
20630 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
20640 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  y;.      for(i=0
20650 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
20660 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
20670 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
20680 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
20690 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
206a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
206b0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
206c0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
206d0 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  t( pSub->pPrior=
206e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
206f0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
20700 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
20710 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
20720 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57   0;.    }.    pW
20730 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
20740 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
20750 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
20760 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
20770 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
20780 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
20790 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
207a0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
207b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
207c0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
207d0 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
207e0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
207f0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
20800 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
20810 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20820 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20850 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
20860 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20  aving, 0));.    
20870 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
20880 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  t->pGroupBy==0 )
20890 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
208a0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
208b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
208c0 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  b, pSub->pGroupB
208d0 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  y, 0);.    }else
208e0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
208f0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
20900 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
20910 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
20920 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  here);.    }.   
20930 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
20940 20 70 50 61 72 65 6e 74 2c 20 69 50 61 72 65 6e   pParent, iParen
20950 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2c  t, pSub->pEList,
20960 20 30 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54   0);.  .    /* T
20970 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
20980 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
20990 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
209a0 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
209b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
209c0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
209d0 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
209e0 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
209f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
20a00 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
20a10 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
20a20 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
20a30 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
20a40 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
20a50 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
20a60 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
20a70 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
20a80 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
20a90 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
20aa0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
20ab0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
20ac0 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
20ad0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
20ae0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
20af0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
20b00 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
20b10 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
20b20 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
20b30 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
20b40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
20b50 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
20b60 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
20b70 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
20b80 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
20b90 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
20ba0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
20bb0 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20  b, pSub1);..#if 
20bc0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
20bd0 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
20be0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
20bf0 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
20c00 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
20c10 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66  arse,p,("After f
20c20 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b  lattening:\n"));
20c30 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
20c40 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
20c50 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
20c60 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
20c70 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
20c80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
20c90 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
20ca0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20cb0 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20  VIEW) */....#if 
20cc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20cd0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
20ce0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
20cf0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
20d00 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
20d10 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45  f relevant WHERE
20d20 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
20d30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20d40 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45   into.** the WHE
20d50 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62  RE clause of sub
20d60 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a  query.  Example:
20d70 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
20d80 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
20d90 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
20da0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
20db0 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
20dc0 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20  .** Transformed 
20dd0 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  into:.**.**    S
20de0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
20df0 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
20e00 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48   AS y FROM t1 WH
20e10 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d  ERE a=5 AND c-d=
20e20 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45  10).**     WHERE
20e30 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
20e40 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73  *.** The hope is
20e50 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20e60 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e  added to the inn
20e70 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61  er query will ma
20e80 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66  ke it more.** ef
20e90 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44  ficient..**.** D
20ea0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
20eb0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
20ec0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  if:.**.**   (1) 
20ed0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
20ee0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  is an aggregate.
20ef0 20 20 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c    (In that case,
20f00 20 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e   we'd really wan
20f10 74 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f  t.**       to co
20f20 70 79 20 74 68 65 20 6f 75 74 65 72 20 57 48 45  py the outer WHE
20f30 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE-clause terms 
20f40 6f 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20  onto the HAVING 
20f50 63 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a  clause of the.**
20f60 20 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65         inner que
20f70 72 79 2e 20 20 42 75 74 20 74 68 65 79 20 70 72  ry.  But they pr
20f80 6f 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c  obably won't hel
20f90 70 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f  p there so do no
20fa0 74 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a  t bother.).**.**
20fb0 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72     (2) The inner
20fc0 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65   query is the re
20fd0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
20fe0 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  a common table e
20ff0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
21000 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72     (3) The inner
21010 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d   query has a LIM
21020 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65  IT clause (since
21030 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
21040 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20  the WHERE.**    
21050 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63     close would c
21060 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e  hange the meanin
21070 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e  g of the LIMIT).
21080 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65  .**.**   (4) The
21090 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
210a0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
210b0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
210c0 2e 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a  .  (The caller.*
210d0 2a 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73  *       enforces
210e0 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
210f0 6e 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  n since this rou
21100 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61  tine does not ha
21110 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20  ve enough.**    
21120 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74     information t
21130 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20  o know.).**.**  
21140 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63   (5) The WHERE c
21150 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
21160 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
21170 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
21180 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f  lause.**       o
21190 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  f a LEFT JOIN..*
211a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
211b0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
211c0 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72  made and non-zer
211d0 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  o if one or more
211e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a   WHERE clause.**
211f0 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
21200 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  cated into the s
21210 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
21220 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57  ic int pushDownW
21230 68 65 72 65 54 65 72 6d 73 28 0a 20 20 73 71 6c  hereTerms(.  sql
21240 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
21250 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21260 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66  se connection (f
21270 6f 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a  or malloc()) */.
21280 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c    Select *pSubq,
21290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
212a0 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48  ubquery whose WH
212b0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
212c0 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f   be augmented */
212d0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
212e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
212f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
21300 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21310 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  */.  int iCursor
21320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
21330 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
21340 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  he subquery */.)
21350 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
21360 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
21370 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30  .  if( pWhere==0
21380 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21390 66 28 20 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c  f( (pSubq->selFl
213a0 61 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67  ags & (SF_Aggreg
213b0 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65  ate|SF_Recursive
213c0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  ))!=0 ){.     re
213d0 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
213e0 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20  ictions (1) and 
213f0 28 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (2) */.  }.  if(
21400 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d   pSubq->pLimit!=
21410 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
21420 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
21430 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
21440 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
21450 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
21460 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
21470 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c  wnWhereTerms(db,
21480 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e   pSubq, pWhere->
21490 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29  pRight, iCursor)
214a0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
214b0 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
214c0 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  }.  if( ExprHasP
214d0 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
214e0 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
214f0 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72  turn 0; /* restr
21500 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69 66  iction 5 */.  if
21510 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
21520 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
21530 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
21540 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
21550 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
21560 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  {.      pNew = s
21570 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
21580 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
21590 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
215a0 45 78 70 72 28 64 62 2c 20 70 4e 65 77 2c 20 69  Expr(db, pNew, i
215b0 43 75 72 73 6f 72 2c 20 70 53 75 62 71 2d 3e 70  Cursor, pSubq->p
215c0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 53  EList);.      pS
215d0 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ubq->pWhere = sq
215e0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
215f0 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
21600 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75  pNew);.      pSu
21610 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69  bq = pSubq->pPri
21620 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
21630 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a  return nChng;.}.
21640 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
21650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
21660 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
21670 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21680 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
21690 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
216a0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
216b0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
216c0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
216d0 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
216e0 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
216f0 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
21700 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
21710 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
21720 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
21730 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
21740 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
21750 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
21760 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
21770 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
21780 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
21790 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
217a0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
217b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
217c0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
217d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
217e0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
217f0 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
21800 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
21810 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21820 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
21830 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
21840 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
21850 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
21860 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
21870 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
21880 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
21890 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
218a0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
218b0 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
218c0 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
218d0 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
218e0 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
218f0 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
21900 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
21910 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21920 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
21930 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
21940 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
21950 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
21960 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
21970 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
21980 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
21990 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
219a0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
219b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
219c0 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
219d0 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
219e0 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
219f0 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
21a00 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
21a10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
21a20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
21a30 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
21a40 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
21a50 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
21a60 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
21a70 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
21a80 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
21a90 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
21aa0 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
21ab0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
21ac0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
21ad0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
21ae0 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
21af0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
21b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
21b10 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
21b20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
21b30 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
21b40 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
21b50 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
21b60 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
21b70 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
21b80 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
21b90 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
21ba0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
21bb0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
21bc0 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
21bd0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
21be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
21bf0 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
21c00 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
21c10 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
21c20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
21c30 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
21c40 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
21c50 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
21c60 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
21c70 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
21c80 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
21c90 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
21ca0 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
21cb0 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
21cc0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
21cd0 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
21ce0 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
21cf0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
21d00 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
21d10 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
21d20 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
21d30 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
21d40 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
21d50 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
21d60 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
21d70 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
21d80 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
21d90 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
21da0 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
21db0 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
21dc0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
21dd0 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
21de0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
21df0 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
21e00 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
21e10 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
21e20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
21e30 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
21e40 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
21e50 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
21e60 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
21e70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
21e80 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
21e90 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
21ea0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
21eb0 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
21ec0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
21ed0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
21ee0 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
21ef0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
21f00 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
21f10 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
21f20 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
21f30 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
21f40 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
21f50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
21f60 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
21f70 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
21f80 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
21f90 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
21fa0 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
21fb0 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
21fc0 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
21fd0 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
21fe0 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
21ff0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
22000 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
22010 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
22020 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
22030 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
22040 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
22050 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
22060 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
22070 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
22080 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
22090 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
220a0 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
220b0 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
220c0 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
220d0 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
220e0 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
220f0 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
22100 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
22110 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
22120 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
22130 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
22140 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
22150 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
22160 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
22170 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
22180 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
22190 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
221a0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
221b0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
221c0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
221d0 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
221e0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
221f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
22200 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
22210 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
22220 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
22230 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
22240 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
22250 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
22260 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
22270 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
22280 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
22290 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
222a0 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
222b0 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
222c0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
222d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
222e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
222f0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
22300 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
22310 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
22320 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
22330 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
22340 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
22350 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
22360 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
22370 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
22380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
22390 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
223a0 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
223b0 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
223c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
223d0 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
223e0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
223f0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
22400 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
22410 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
22420 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
22430 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
22440 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
22450 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
22460 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
22470 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
22480 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
22490 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
224a0 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
224b0 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
224c0 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
224d0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
224e0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
224f0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
22500 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
22510 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
22520 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
22530 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
22540 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
22550 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
22560 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
22570 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
22580 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
22590 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
225a0 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
225b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
225c0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
225d0 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
225e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
225f0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
22600 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
22610 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
22620 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
22630 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
22640 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
22650 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
22660 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
22670 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
22680 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
22690 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
226a0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
226b0 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
226c0 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
226d0 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
226e0 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
226f0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
22700 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
22710 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
22720 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
22730 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
22740 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
22750 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
22760 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
22770 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
22780 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
22790 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
227a0 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
227b0 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
227c0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
227d0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
227e0 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
227f0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
22800 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22810 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
22820 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
22830 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
22840 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
22850 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
22860 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
22870 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22880 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
22890 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
228a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
228b0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
228c0 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
228d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
228e0 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
228f0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
22900 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22910 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
22920 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
22930 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
22940 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
22950 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
22960 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
22970 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
22980 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
22990 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
229a0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
229b0 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
229c0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
229d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
229e0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
229f0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
22a00 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
22a10 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
22a20 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
22a30 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
22a40 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
22a50 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
22a60 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
22a70 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
22a80 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
22a90 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
22aa0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
22ab0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
22ac0 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
22ad0 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
22ae0 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
22af0 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
22b00 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
22b10 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
22b20 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
22b30 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
22b40 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
22b50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22b60 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
22b70 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
22b80 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
22b90 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
22ba0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
22bb0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
22bc0 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
22bd0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
22be0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
22bf0 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
22c00 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
22c10 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
22c20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
22c30 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
22c40 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
22c50 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
22c60 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
22c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22c80 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
22c90 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
22ca0 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
22cb0 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
22cc0 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
22cd0 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
22ce0 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
22cf0 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
22d00 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
22d10 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
22d20 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
22d30 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
22d40 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
22d50 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
22d60 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
22d70 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
22d80 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
22d90 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
22da0 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
22db0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
22dc0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
22dd0 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
22de0 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
22df0 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
22e00 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
22e10 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
22e20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
22e30 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
22e40 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
22e50 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72  /* Current inner
22e80 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
22e90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
22ea0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22eb0 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
22ec0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
22ed0 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
22ee0 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f00 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
22f10 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
22f20 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
22f30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
22f40 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
22f50 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
22f60 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
22f70 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
22f80 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
22f90 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
22fa0 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
22fb0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
22fc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
22fd0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
22fe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
22ff0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
23000 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23010 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
23020 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
23030 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
23040 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
23050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23060 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23070 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
23080 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
23090 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
230a0 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
230b0 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
230c0 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
230d0 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
230e0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
230f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23100 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
23110 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
23120 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23130 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
23140 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
23150 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
23160 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
23170 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
23180 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
23190 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
231a0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
231b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
231c0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
231d0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
231e0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
231f0 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
23200 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
23210 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
23220 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
23230 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23240 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
23250 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
23260 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
23270 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23280 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
23290 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
232a0 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
232b0 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
232c0 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e  ==0 || (pParse->
232d0 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72  pWith==0 && pPar
232e0 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d  se->pWithToFree=
232f0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69  =0) );.  if( pWi
23300 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  th ){.    assert
23310 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21  ( pParse->pWith!
23320 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57  =pWith );.    pW
23330 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
23340 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
23350 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
23360 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
23370 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e  bFree ) pParse->
23380 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57  pWithToFree = pW
23390 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ith;.  }.}../*.*
233a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
233b0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
233c0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
233d0 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
233e0 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
233f0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
23400 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
23410 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
23420 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
23430 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
23440 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
23450 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
23460 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
23470 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
23480 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
23490 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
234a0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
234b0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
234c0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
234d0 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
234e0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
234f0 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
23500 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
23510 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
23520 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
23530 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
23540 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
23550 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
23560 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
23570 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
23580 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
23590 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
235a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
235b0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
235c0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
235d0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
235e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
235f0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
23600 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
23610 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
23620 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
23630 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
23640 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
23650 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
23660 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
23670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23680 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
23690 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
236a0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
236b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
236c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
236d0 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
236e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
236f0 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
23700 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
23710 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
23720 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23730 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
23740 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
23750 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
23760 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23770 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
23780 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
23790 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
237a0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
237b0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
237c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
237d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
237e0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
237f0 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
23800 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
23810 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
23820 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
23830 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
23840 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
23850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23860 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
23870 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
23880 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
23890 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
238a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
238b0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
238c0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
238d0 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
238e0 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  CteErr is non-NU
238f0 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
23900 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
23910 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
23920 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23930 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
23940 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
23950 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23960 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
23970 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74  ly. If pCte->zCt
23980 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  eErr is NULL, th
23990 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
239a0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
239b0 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
239c0 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
239d0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
239e0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b  pCte->zCteErr ){
239f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23a00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
23a10 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43  Cte->zCteErr, pC
23a20 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23a40 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
23a50 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23a60 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
23a70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23a80 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
23a90 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23aa0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
23ab0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
23ac0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23ad0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  .    pTab->nRef 
23ae0 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
23af0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
23b00 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
23b10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
23b20 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
23b30 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
23b40 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
23b50 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
23b60 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
23b70 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
23b80 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
23b90 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
23ba0 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
23bb0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
23bc0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
23bd0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
23be0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
23bf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23c00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23c10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72  NOMEM;.    asser
23c20 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
23c30 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
23c40 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
23c50 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
23c60 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
23c70 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
23c80 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
23c90 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
23ca0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
23cb0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
23cc0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
23cd0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
23ce0 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
23cf0 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
23d00 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
23d10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23d20 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
23d30 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
23d40 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23d50 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
23d60 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
23d70 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
23d80 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
23d90 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
23da0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
23db0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
23dc0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
23dd0 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
23de0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23df0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
23e00 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
23e10 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pItem->fg.isRecu
23e20 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
23e30 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
23e40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
23e50 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
23e60 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
23e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23e80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
23e90 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
23ea0 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
23eb0 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
23ec0 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32  if( pTab->nRef>2
23ed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23ee0 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
23ef0 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
23f00 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
23f10 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
23f20 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
23f30 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
23f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23f50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
23f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
23f70 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28  b->nRef==1 || ((
23f80 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
23f90 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
23fa0 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29  pTab->nRef==2 ))
23fb0 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74  ;..    pCte->zCt
23fc0 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  eErr = "circular
23fd0 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
23fe0 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
23ff0 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
24000 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24010 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
24020 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
24030 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
24040 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
24050 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
24060 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24070 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20  th = pWith;..   
24080 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
24090 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
240a0 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
240b0 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
240c0 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
240d0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
240e0 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
240f0 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
24100 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
24110 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
24120 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24130 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24140 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
24150 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
24160 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
24170 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
24180 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
24190 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
241a0 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
241b0 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
241c0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
241d0 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
241e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
241f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24200 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
24210 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
24220 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
24230 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
24240 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
24250 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
24260 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
24270 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
24280 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
24290 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
242a0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
242b0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
242c0 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
242d0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
242e0 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
242f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
24300 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65  e->zCteErr = "re
24310 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
24320 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
24330 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
24340 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
24350 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
24360 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
24370 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
24380 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
24390 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
243a0 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
243b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
243c0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
243d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
243e0 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
243f0 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
24400 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
24410 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
24420 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
24430 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
24440 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
24450 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
24460 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
24470 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24480 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
24490 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
244a0 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
244b0 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
244c0 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
244d0 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
244e0 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
244f0 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
24500 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
24510 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
24520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
24530 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
24540 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
24550 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
24560 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
24570 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74  r->pParse;.  Wit
24580 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
24590 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
245a0 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21  th;.  if( pWith!
245b0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
245c0 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
245d0 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50  =pWith );.    pP
245e0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
245f0 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d  ith->pOuter;.  }
24600 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
24610 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
24620 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
24630 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
24640 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
24650 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
24660 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
24670 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
24680 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
24690 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
246a0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
246b0 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
246c0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
246d0 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
246e0 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
246f0 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
24700 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
24710 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
24720 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
24730 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
24740 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
24750 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
24760 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
24770 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
24780 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
24790 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
247a0 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
247b0 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
247c0 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
247d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
247e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
247f0 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
24800 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
24810 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
24820 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
24830 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
24840 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
24850 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
24860 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
24870 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
24880 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
24890 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
248a0 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
248b0 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
248c0 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
248d0 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
248e0 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
248f0 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
24900 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
24910 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
24920 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
24930 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
24940 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
24950 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
24960 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
24970 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
24980 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
24990 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
249a0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
249b0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
249c0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
249d0 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
249e0 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
249f0 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
24a00 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
24a10 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
24a20 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
24a30 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
24a40 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
24a50 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
24a60 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
24a70 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
24a80 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
24a90 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
24aa0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
24ab0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
24ac0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24ad0 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
24ae0 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
24af0 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
24b00 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
24b10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24b20 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
24b30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24b40 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
24b50 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
24b60 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
24b70 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
24b80 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
24b90 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
24ba0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
24bb0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
24bc0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
24bd0 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
24be0 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
24bf0 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
24c00 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
24c10 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
24c20 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
24c30 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
24c40 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
24c50 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b  ist;.  if( pWalk
24c60 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62  er->xSelectCallb
24c70 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57  ack2==selectPopW
24c80 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ith ){.    sqlit
24c90 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
24ca0 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74  e, findRightmost
24cb0 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  (p)->pWith, 0);.
24cc0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
24cd0 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
24ce0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
24cf0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
24d00 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
24d10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
24d20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
24d30 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
24d40 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
24d50 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
24d60 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
24d70 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
24d80 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
24d90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
24da0 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
24db0 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
24dc0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
24dd0 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
24de0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
24df0 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
24e00 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
24e10 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
24e20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
24e30 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
24e40 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
24e50 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
24e60 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
24e70 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
24e80 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
24e90 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73  e *pTab;.    ass
24ea0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69  ert( pFrom->fg.i
24eb0 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c  sRecursive==0 ||
24ec0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
24ed0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
24ee0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
24ef0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
24f00 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
24f10 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  pTab==0 );.#ifnd
24f20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24f30 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45  TE.    if( withE
24f40 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70  xpand(pWalker, p
24f50 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57  From) ) return W
24f60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
24f70 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20  ( pFrom->pTab ) 
24f80 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20  {} else.#endif. 
24f90 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
24fa0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
24fb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
24fc0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
24fd0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
24fe0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
24ff0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
25000 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
25010 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
25020 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
25030 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
25040 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
25050 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
25060 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c    if( sqlite3Wal
25070 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25080 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20   pSel) ) return 
25090 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
250a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
250b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
250c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
250d0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
250e0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
250f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25100 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
25110 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
25120 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
25130 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
25140 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c   "sqlite_sq_%p",
25150 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
25160 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
25170 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
25180 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
25190 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
251a0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
251b0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
251c0 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e  ->pEList,&pTab->
251d0 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c  nCol,&pTab->aCol
251e0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
251f0 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
25200 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
25210 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
25220 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
25230 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
25240 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
25250 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
25260 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
25270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
25280 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
25290 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
252a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
252b0 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
252c0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
252d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
252e0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
252f0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
25300 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
25310 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
25320 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
25330 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25340 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
25350 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b  >nRef==0xffff ){
25360 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25370 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25380 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
25390 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
253a0 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
253b0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
253c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
253d0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
253e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
253f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
25400 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
25410 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
25420 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
25430 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
25440 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
25450 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
25460 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
25470 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
25480 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
25490 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
254a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
254b0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
254c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
254d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
254e0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
254f0 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
25500 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
25510 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
25520 54 61 62 46 75 6e 63 20 26 26 20 21 49 73 56 69  TabFunc && !IsVi
25530 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
25540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25550 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25560 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
25570 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61 62 2d  function", pTab-
25580 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
25590 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
255a0 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ort;.        }. 
255b0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
255c0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
255d0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
255e0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
255f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
25600 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
25610 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
25620 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
25630 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
25640 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
25650 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
25660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
25670 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25680 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
25690 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
256a0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
256b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
256c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
256d0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
256e0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
256f0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
25700 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
25710 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
25720 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
25730 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
25740 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25750 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25760 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
25770 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
25780 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
25790 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
257a0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
257b0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
257c0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
257d0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
257e0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
257f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
25800 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
25810 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
25820 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
25830 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
25840 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
25850 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
25860 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
25870 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
25880 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
25890 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
258a0 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
258b0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
258c0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
258d0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
258e0 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
258f0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
25900 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
25910 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
25920 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
25930 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
25940 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
25950 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
25960 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
25970 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
25980 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
25990 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
259a0 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
259b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
259c0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
259d0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
259e0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
259f0 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
25a00 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
25a10 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
25a20 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
25a30 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
25a40 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
25a50 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
25a60 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
25a70 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
25a80 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
25a90 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
25aa0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
25ab0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
25ac0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
25ad0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
25ae0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
25af0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
25b00 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
25b10 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
25b20 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
25b30 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
25b40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
25b50 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
25b60 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
25b70 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
25b80 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
25b90 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
25ba0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
25bb0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
25bc0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
25bd0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
25be0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
25bf0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
25c00 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
25c10 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
25c20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
25c30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
25c40 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
25c50 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
25c60 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
25c70 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
25c80 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
25c90 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
25ca0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
25cb0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
25ce0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
25cf0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
25d00 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
25d10 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
25d20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
25d30 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
25d40 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
25d50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
25d60 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25d70 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
25d80 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
25d90 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20  K_ASTERISK.     
25da0 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b    && (pE->op!=TK
25db0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
25dc0 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29  op!=TK_ASTERISK)
25dd0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25de0 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
25df0 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
25e00 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
25e10 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
25e20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25e30 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
25e40 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
25e50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
25e60 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
25e70 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
25e80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
25e90 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
25ea0 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
25eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
25ec0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
25ed0 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
25ee0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
25ef0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
25f00 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
25f10 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
25f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
25f30 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
25f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f50 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
25f60 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
25f70 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
25f80 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
25f90 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
25fa0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
25fb0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
25fc0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
25fd0 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
25fe0 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
25ff0 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
26000 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
26010 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
26020 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
26030 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
26040 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26050 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
26060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
26070 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26080 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
26090 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
260a0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
260b0 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
260c0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
260d0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
260e0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
260f0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
26100 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
26110 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
26120 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
26130 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
26140 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
26150 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
26160 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
26170 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
26180 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
26190 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
261a0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
261b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
261c0 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
261d0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
261e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
261f0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
26200 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
26210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26220 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26230 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
26240 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
26250 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
26260 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
26270 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
26280 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
26290 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
262a0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
262b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
262c0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
262d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
262e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
262f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26300 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
26310 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
26320 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
26330 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
26340 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
26350 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
26360 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22  b[iDb].zName : "
26370 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
26380 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
26390 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
263a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
263b0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
263c0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
263d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
263e0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
263f0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
26400 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
26410 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
26420 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
26430 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
26440 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
26450 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
26460 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
26470 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
26480 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
26490 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
264a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
264b0 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
264c0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
264d0 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
264e0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
264f0 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
26500 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
26510 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
26520 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
26530 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26540 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
26550 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
26560 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
26570 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
26580 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
26590 6e 27 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  n', do not inclu
265a0 64 65 20 69 74 20 69 6e 0a 20 20 20 20 20 20 20  de it in.       
265b0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 61       ** the expa
265c0 6e 64 65 64 20 72 65 73 75 6c 74 2d 73 65 74 20  nded result-set 
265d0 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
265e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
265f0 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
26600 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
26610 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
26620 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26630 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26640 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
26650 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
26660 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
26670 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
26680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
26690 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
266a0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
266b0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
266c0 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
266d0 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
266e0 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
266f0 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
26700 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26710 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
26720 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
26730 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
26740 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
26750 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
26760 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
26770 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
26780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26790 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
267a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
267b0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
267c0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
267d0 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
267e0 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
267f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26800 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
26810 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
26820 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
26830 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
26840 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
26850 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
26860 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
26870 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
26880 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
268a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
268b0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
268c0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
268d0 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
268e0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
268f0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
26900 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
26910 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26920 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
26930 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
26940 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
26950 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
26960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26970 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
26980 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
26990 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
269a0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
269b0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
269c0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
269d0 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
269f0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
26a20 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
26a30 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
26a50 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
26a60 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
26a70 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20  , pLeft, pExpr, 
26a80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
26a90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26aa0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
26ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26ac0 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
26ad0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
26ae0 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
26af0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
26b00 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
26b10 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
26b40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
26b50 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
26b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26b70 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
26b80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
26b90 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
26ba0 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
26bb0 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
26bc0 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
26bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
26be0 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
26bf0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
26c00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26c10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26c20 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
26c30 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
26c40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
26c50 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
26c60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
26c70 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
26c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
26c90 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
26ca0 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
26cb0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
26cc0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
26cd0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
26cf0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
26d00 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
26d10 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
26d20 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
26d30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26d40 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
26d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26d70 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
26d80 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
26d90 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
26da0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
26dd0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
26de0 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26e00 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
26e10 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
26e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e30 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
26e40 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
26e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26e60 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
26e70 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
26e80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26ea0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
26eb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
26ec0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
26ed0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
26ee0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
26ef0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
26f00 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
26f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26f30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26f40 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
26f50 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
26f60 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26f70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26f80 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
26f90 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
26fa0 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
26fb0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
26fc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
26fd0 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
26fe0 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
26ff0 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
27000 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
27010 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
27020 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27030 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
27040 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
27050 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
27060 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
27070 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
27080 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
27090 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
270a0 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
270b0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
270c0 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
270d0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
270e0 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
270f0 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
27100 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
27110 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
27120 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
27130 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
27140 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
27150 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
27160 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
27170 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
27180 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
27190 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
271a0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
271b0 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
271c0 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
271d0 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
271e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
271f0 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
27200 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
27210 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
27220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
27230 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
27240 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
27250 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
27260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27270 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
27280 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
27290 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
272a0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
272b0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
272c0 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
272d0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
272e0 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
272f0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
27300 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
27310 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
27320 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
27330 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
27340 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
27350 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
27360 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
27370 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
27380 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
27390 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
273a0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
273b0 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
273c0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
273d0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
273e0 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
273f0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
27400 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
27410 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
27420 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
27430 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
27440 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
27450 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
27460 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
27470 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
27480 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
27490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
274a0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
274b0 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
274c0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
274d0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
274e0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
274f0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
27500 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
27510 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
27520 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
27530 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
27540 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
27550 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
27560 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27570 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
27580 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
27590 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
275a0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
275b0 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
275c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
275d0 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
275e0 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74  ;.  if( (pSelect
275f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27600 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29  MultiValue)==0 )
27610 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
27620 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
27630 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
27640 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
27650 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
27660 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
27670 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27680 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
27690 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
276a0 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
276b0 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
276c0 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
276d0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
276e0 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
276f0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
27700 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
27710 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
27720 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
27730 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
27740 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
27750 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
27760 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
27770 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
27780 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
27790 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
277a0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
277b0 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
277c0 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
277d0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
277e0 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
277f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
27800 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
27810 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
27820 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
27830 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
27840 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
27850 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
27860 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
27870 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
27880 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
27890 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
278a0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
278b0 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
278c0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
278d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
278e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
278f0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
27900 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27910 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
27920 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
27930 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
27940 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
27950 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
27960 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
27970 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
27980 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
27990 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
279a0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
279b0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
279c0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
279d0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
279e0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
279f0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
27a00 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
27a10 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
27a20 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
27a30 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
27a40 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
27a50 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
27a60 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
27a70 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
27a80 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27a90 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
27aa0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
27ab0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
27ac0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
27ad0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
27ae0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
27af0 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
27b00 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
27b10 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
27b20 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
27b30 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
27b40 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
27b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
27b60 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
27b70 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
27b80 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
27b90 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
27ba0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
27bb0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
27bc0 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
27bd0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
27be0 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
27bf0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
27c00 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
27c10 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
27c20 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
27c30 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
27c40 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
27c50 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
27c60 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27c70 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
27c80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
27c90 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
27ca0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
27cb0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65  eof(w));.  w.xSe
27cc0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
27cd0 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
27ce0 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
27cf0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
27d00 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
27d10 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
27d20 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
27d30 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
27d40 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
27d50 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
27d60 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
27d70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
27d80 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
27d90 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
27da0 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
27db0 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
27dc0 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
27dd0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
27de0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
27df0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
27e00 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
27e10 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
27e20 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
27e30 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
27e40 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
27e50 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
27e60 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
27e70 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
27e80 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
27e90 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
27ea0 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
27eb0 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
27ec0 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
27ed0 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
27ee0 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
27ef0 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
27f00 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
27f10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
27f20 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
27f30 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
27f40 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
27f50 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
27f60 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
27f70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
27f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27f90 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
27fa0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
27fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27fc0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
27fd0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
27fe0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
27ff0 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
28000 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
28010 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
28020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
28030 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
28040 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
28050 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
28060 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
28070 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28080 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
28090 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
280a0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
280b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
280c0 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
280d0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
280e0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
280f0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28100 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
28110 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
28120 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
28130 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28140 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
28150 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
28160 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
28170 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
28180 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
28190 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
281a0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
281b0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
281c0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
281d0 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
281e0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
281f0 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
28200 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
28210 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
28220 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
28230 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
28240 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
28250 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
28260 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
28270 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
28280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28290 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
282a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
282b0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
282c0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
282d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
282e0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
282f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
28300 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
28310 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
28320 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
28330 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
28340 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
28350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28360 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
28370 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
28380 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
28390 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
283a0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
283b0 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
283c0 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
283d0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
283e0 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
283f0 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
28400 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
28410 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
28420 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
28430 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
28440 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
28450 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
28460 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
28470 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
28480 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
28490 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
284a0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
284b0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
284c0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
284d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
284e0 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
284f0 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
28500 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
28510 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
28520 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
28530 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
28540 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
28550 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
28560 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
28570 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
28580 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
28590 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
285a0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
285b0 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
285c0 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
285d0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
285e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
285f0 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
28600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
28610 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
28620 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
28630 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
28640 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
28650 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
28660 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
28670 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28680 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
28690 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
286a0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
286b0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
286c0 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
286d0 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
286e0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
286f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28700 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
28710 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
28720 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
28730 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
28740 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
28750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28760 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
28770 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
28780 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
287b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
287c0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
287d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
287e0 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
287f0 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
28800 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
28810 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
28820 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
28830 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
28840 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
28850 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
28860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
28870 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28880 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28890 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
288a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
288b0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
288c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
288d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
288e0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
288f0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
28900 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
28910 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
28920 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
28930 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28940 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
28950 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
28960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28970 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
28980 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
28990 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
289a0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
289d0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
289e0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
289f0 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
28a00 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
28a10 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
28a20 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
28a30 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
28a40 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
28a50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
28a60 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
28a70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
28a80 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
28a90 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
28aa0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28ab0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
28ac0 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
28ad0 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
28ae0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
28af0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
28b00 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
28b10 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
28b20 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
28b30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
28b40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
28b50 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28b60 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
28b70 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
28b80 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
28b90 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
28ba0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
28bb0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
28bc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
28bd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
28be0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
28bf0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28c00 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
28c10 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
28c20 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
28c30 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
28c40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
28c50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
28c60 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
28c70 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
28c80 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
28c90 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
28ca0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
28cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28cc0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
28cd0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
28ce0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
28cf0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
28d00 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
28d10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
28d20 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
28d30 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20  stcase( nArg==0 
28d40 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e  );  /* Error con
28d50 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  dition */.      
28d60 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31  testcase( nArg>1
28d70 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e   );   /* Also an
28d80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
28d90 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
28da0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
28db0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
28dc0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
28dd0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
28de0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
28df0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
28e00 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
28e10 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
28e20 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
28e30 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
28e40 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
28e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28e60 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
28e70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
28e80 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
28e90 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
28ea0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
28eb0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
28ec0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
28ed0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
28ee0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
28ef0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
28f00 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
28f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28f20 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
28f30 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
28f40 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
28f50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28f60 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
28f70 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
28f80 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
28f90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
28fa0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
28fb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
28fc0 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
28fd0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
28fe0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
28ff0 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
29000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
29010 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20  v, OP_AggStep0, 
29020 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
29030 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
29040 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
29050 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
29060 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
29070 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
29080 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
29090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
290a0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
290b0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
290c0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
290d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
290e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
290f0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
29100 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
29110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29120 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
29130 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
29140 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
29150 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
29160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29170 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
29180 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
29190 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
291a0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
291b0 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
291c0 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
291d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
291e0 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
291f0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
29200 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
29210 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
29220 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
29230 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
29240 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
29250 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
29260 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
29270 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
29280 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
29290 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
292a0 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
292b0 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
292c0 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
292d0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
292e0 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
292f0 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
29300 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
29310 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
29320 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
29330 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
29340 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
29350 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
29360 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
29370 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
29380 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
29390 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
293a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
293b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
293c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
293d0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
293e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
293f0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
29400 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
29410 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
29420 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
29430 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
29440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
29450 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
29460 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
29470 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
29480 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
29490 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
294a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
294b0 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
294c0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
294d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
294e0 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
294f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
29500 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
29510 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
29520 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
29530 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
29540 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
29550 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
29560 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
29570 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
29580 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
29590 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
295a0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
295b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
295e0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
295f0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
29600 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
29610 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
29620 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29640 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
29650 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
29660 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
29670 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
29680 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
29690 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
296a0 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
296b0 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
296c0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
296d0 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68  (pIdx)));.    ch
296e0 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
296f0 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
29700 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
29710 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
29720 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
29730 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
29740 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
29750 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
29760 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
29770 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
29780 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
29790 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
297a0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
297b0 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
297c0 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
297d0 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
297e0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
297f0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
29800 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
29810 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
29820 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
29830 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
29840 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
29850 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
29860 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
29870 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
29880 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
29890 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
298a0 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
298b0 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
298c0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
298d0 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
298e0 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
298f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29900 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
29910 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
29920 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
29930 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
29940 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
29950 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
29960 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
29970 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
29980 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
29990 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
299a0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
299b0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
299c0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
299d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
299e0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
299f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29a00 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
29a10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
29a20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
29a30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
29a40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
29a50 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
29a60 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
29a70 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
29a80 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
29a90 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
29aa0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
29ab0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
29ac0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
29ad0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29ae0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
29af0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
29b00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
29b10 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
29b20 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
29b30 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
29b40 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
29b50 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
29b60 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
29b70 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
29b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
29b90 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
29ba0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
29bb0 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
29bc0 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f   *pEList = 0;  /
29bd0 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
29be0 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
29bf0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
29c00 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
29c10 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
29c20 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
29c30 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
29c40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
29c50 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
29c60 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
29c70 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
29c80 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
29c90 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
29ca0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
29cb0 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
29cc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
29cd0 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
29ce0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
29cf0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
29d00 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
29d10 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
29d20 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
29d30 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
29d40 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
29d50 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
29d60 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
29d70 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
29d80 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
29d90 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
29da0 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
29db0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
29dc0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
29dd0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
29de0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
29df0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
29e00 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
29e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
29e20 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
29e30 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
29e40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
29e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29e60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
29e70 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
29e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
29e90 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
29ea0 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
29eb0 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
29ec0 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
29ed0 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
29ee0 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
29ef0 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
29f00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
29f10 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
29f20 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
29f30 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
29f40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
29f50 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
29f60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
29f70 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
29f80 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
29f90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
29fa0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
29fb0 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
29fc0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
29fd0 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  LED.  pParse->nS
29fe0 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20  electIndent++;. 
29ff0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2a000 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e  Parse,p, ("begin
2a010 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29   processing:\n")
2a020 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2a030 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2a040 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  100 ){.    sqlit
2a050 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2a060 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2a070 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2a080 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a090 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a0a0 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
2a0b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a0c0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a0d0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46  st->eDest!=SRT_F
2a0e0 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2a0f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2a100 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2a110 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
2a120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2a130 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2a140 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2a150 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49  Queue );.  if( I
2a160 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2a170 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
2a180 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
2a190 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
2a1a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a1b0 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
2a1c0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2a1d0 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
2a1e0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a1f0 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c  ==SRT_Discard ||
2a200 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2a210 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75  t->eDest==SRT_Qu
2a220 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65  eue  || pDest->e
2a230 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
2a240 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  fo ||.          
2a250 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a260 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20  RT_DistQueue || 
2a270 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a280 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20  T_Fifo);.    /* 
2a290 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
2a2a0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
2a2b0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
2a2c0 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
2a2d0 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
2a2e0 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
2a2f0 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
2a300 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a310 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
2a320 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
2a330 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2a340 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2a350 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2a360 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2a370 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
2a380 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  , 0);.  memset(&
2a390 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
2a3a0 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
2a3b0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2a3c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
2a3d0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2a3e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2a3f0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2a400 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2a410 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2a420 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2a430 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69  pEList!=0 );.  i
2a440 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
2a450 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2a460 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45  te)!=0;.#if SELE
2a470 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2a480 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2a490 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2a4a0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2a4b0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2a4c0 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65  ,p, ("after name
2a4d0 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29   resolution:\n")
2a4e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2a4f0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2a500 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2a510 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  f...  /* If writ
2a520 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
2a530 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
2a540 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
2a550 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
2a560 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
2a570 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a580 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
2a590 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
2a5a0 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
2a5b0 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
2a5c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
2a5d0 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
2a5e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
2a5f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20  endif..  /* Try 
2a600 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
2a610 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2a620 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f  M clause up into
2a630 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a   the main query.
2a640 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2a650 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2a660 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2a670 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2a680 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2a690 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
2a6a0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a6b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2a6c0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2a6d0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
2a6e0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
2a6f0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2a700 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2a710 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20  int isAggSub;.  
2a720 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2a730 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
2a740 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2a750 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2a760 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
2a770 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
2a780 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
2a790 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
2a7a0 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
2a7b0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
2a7c0 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
2a7d0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
2a7e0 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
2a7f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2a800 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a810 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
2a820 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
2a830 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
2a840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a850 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
2a860 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
2a870 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2a880 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
2a890 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2a8a0 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53     }..    isAggS
2a8b0 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
2a8c0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2a8d0 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
2a8e0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
2a8f0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
2a900 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
2a910 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2a920 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
2a930 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
2a940 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
2a950 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
2a960 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
2a970 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
2a980 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2a990 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2a9a0 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
2a9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
2a9c0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2a9d0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2a9e0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2a9f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2aa00 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
2aa10 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2aa20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2aa30 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2aa40 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
2aa50 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61  ndif..  /* Get a
2aa60 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42   pointer the VDB
2aa70 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
2aa80 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67  tion, allocating
2aa90 20 61 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f   a new VDBE if o
2aaa0 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ne.  ** does not
2aab0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a   already exist *
2aac0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
2aad0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2aae0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
2aaf0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23  o select_end;..#
2ab00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ab10 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
2ab20 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
2ab30 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
2ab40 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
2ab50 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
2ab60 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
2ab70 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
2ab80 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
2ab90 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
2aba0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
2abb0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
2abc0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2abd0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2abe0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2abf0 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43  ctId);.#if SELEC
2ac00 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2ac10 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
2ac20 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
2ac30 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
2ac40 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
2ac50 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  .    pParse->nSe
2ac60 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
2ac70 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2ac80 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2ac90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2aca0 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
2acb0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
2acc0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
2acd0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2ace0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2acf0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2ad00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2ad10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2ad20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2ad30 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2ad40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ad50 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2ad60 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
2ad70 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
2ad80 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
2ad90 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
2ada0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2adb0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2adc0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
2add0 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
2ade0 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
2adf0 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
2ae00 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
2ae10 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
2ae20 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
2ae30 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
2ae40 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
2ae50 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
2ae60 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
2ae70 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
2ae80 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
2ae90 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
2aea0 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
2aeb0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
2aec0 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
2aed0 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
2aee0 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
2aef0 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
2af00 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
2af10 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
2af20 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
2af30 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
2af40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
2af50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2af60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
2af70 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2af80 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
2af90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2afa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2afb0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2afc0 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
2afd0 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
2afe0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2aff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
2b000 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
2b010 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
2b020 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
2b030 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
2b040 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
2b050 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
2b060 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
2b070 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
2b080 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
2b090 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
2b0a0 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
2b0b0 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
2b0c0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
2b0d0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
2b0e0 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
2b0f0 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
2b100 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
2b110 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
2b120 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
2b130 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
2b140 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
2b150 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
2b160 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
2b170 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
2b180 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
2b190 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65     /* Make copie
2b1a0 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48  s of constant WH
2b1b0 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
2b1c0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
2b1d0 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20  ery down.    ** 
2b1e0 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75  inside the subqu
2b1f0 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68  ery.  This can h
2b200 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79  elp the subquery
2b210 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66   to run more eff
2b220 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f  iciently..    */
2b230 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d  .    if( (pItem-
2b240 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2b250 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20  T_OUTER)==0.    
2b260 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72   && pushDownWher
2b270 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c  eTerms(db, pSub,
2b280 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2b290 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2b2a0 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2b2b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2b2c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2b2d0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2b2e0 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2b2f0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2b300 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2b310 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2b320 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2b330 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2b340 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2b350 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2b360 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
2b370 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2b380 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2b390 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a  subquery.    */.
2b3a0 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
2b3b0 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 26  ->nSrc==1.     &
2b3c0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2b3d0 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20   SF_All)==0.    
2b3e0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
2b3f0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
2b400 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
2b410 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
2b420 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
2b430 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
2b440 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
2b450 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2b460 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2b470 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
2b480 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
2b490 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2b4a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b4b0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
2b4c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
2b4d0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
2b4e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2b4f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2b500 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
2b510 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2b520 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
2b530 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
2b540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
2b550 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2b560 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
2b570 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2b580 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
2b590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2b5a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2b5b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
2b5c0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2b5d0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2b5e0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2b5f0 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
2b600 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2b610 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
2b620 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
2b630 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
2b640 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
2b650 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2b660 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53  sqlite3LogEst(pS
2b670 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  ub->nSelectRow);
2b680 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
2b690 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
2b6a0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2b6b0 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
2b6c0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
2b6d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2b6e0 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
2b6f0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2b700 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
2b710 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2b720 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
2b730 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
2b740 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
2b750 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
2b760 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
2b770 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2b780 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
2b790 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
2b7a0 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
2b7b0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
2b7c0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
2b7d0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2b7e0 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
2b7f0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
2b800 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
2b810 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
2b820 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
2b830 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
2b840 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
2b850 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
2b860 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
2b870 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
2b880 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2b890 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
2b8a0 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
2b8b0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
2b8c0 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
2b8d0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
2b8e0 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lSub==0 );.     
2b8f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2b900 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
2b910 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64  em;.      topAdd
2b920 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2b930 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2b940 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72  ger, 0, pItem->r
2b950 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2b960 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2b970 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b  Sub = topAddr+1;
2b980 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2b990 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
2b9a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
2b9b0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
2b9c0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
2b9d0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
2b9e0 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
2b9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
2ba00 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
2ba10 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
2ba20 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
2ba30 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
2ba40 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
2ba50 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
2ba60 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
2ba70 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
2ba80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ba90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2baa0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2bab0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2bac0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2bad0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2bae0 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2baf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2bb00 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2bb10 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2bb20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2bb30 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2bb40 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2bb50 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
2bb60 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2bb70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2bb80 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2bb90 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2bba0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2bbb0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2bbc0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2bbd0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2bbe0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2bbf0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2bc00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2bc10 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2bc20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  );.      if( onc
2bc30 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
2bc40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
2bc50 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
2bc60 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
2bc70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2bc80 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
2bc90 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2bca0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2bcb0 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
2bcc0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2bcd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bce0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
2bcf0 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
2bd00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bd10 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2bd20 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2bd30 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2bd40 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2bd50 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2bd60 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2bd70 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
2bd80 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2bd90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2bda0 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
2bdb0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2bdc0 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
2bdd0 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
2bde0 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
2bdf0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
2be00 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
2be10 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
2be20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2be30 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
2be40 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
2be50 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
2be60 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
2be70 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2be80 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
2be90 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2bea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2beb0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2bec0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2bed0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2bee0 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
2bef0 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
2bf00 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
2bf10 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2bf20 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2bf30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2bf40 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
2bf50 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
2bf60 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
2bf70 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
2bf80 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
2bf90 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
2bfa0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
2bfb0 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
2bfc0 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
2bfd0 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
2bfe0 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
2bff0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
2c000 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
2c010 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2c020 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
2c030 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
2c040 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
2c050 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
2c060 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2c070 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
2c080 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
2c090 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
2c0a0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
2c0b0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
2c0c0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
2c0d0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
2c0e0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
2c0f0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
2c100 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
2c110 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
2c120 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
2c130 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
2c140 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
2c150 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
2c160 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
2c170 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
2c180 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
2c190 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
2c1a0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
2c1b0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
2c1c0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
2c1d0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2c1e0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
2c1f0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
2c200 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
2c210 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
2c220 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
2c230 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
2c240 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
2c250 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
2c260 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
2c270 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
2c280 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
2c290 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
2c2a0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
2c2b0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
2c2c0 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
2c2d0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
2c2e0 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
2c2f0 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
2c300 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
2c310 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
2c320 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
2c330 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
2c340 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
2c350 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
2c360 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
2c370 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
2c380 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
2c390 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
2c3a0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2c3b0 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  t );.  }..  /* I
2c3c0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2c3d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2c3e0 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70  hen create an ep
2c3f0 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
2c400 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72  .  ** do the sor
2c410 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20  ting.  But this 
2c420 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61  sorting ephemera
2c430 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  l index might en
2c440 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20  d up.  ** being 
2c450 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
2c460 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ta can be extrac
2c470 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
2c480 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66  d order..  ** If
2c490 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2c4a0 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f  e, then the OP_O
2c4b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2c4c0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2c4d0 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  .  ** changed to
2c4e0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
2c4f0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2c500 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2c510 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f  index is.  ** no
2c520 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73  t needed.  The s
2c530 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2c540 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ex variable is u
2c550 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
2c560 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e  e.  ** that chan
2c570 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
2c580 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2c590 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
2c5a0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
2c5b0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2c5c0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2c5d0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2c5e0 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
2c5f0 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
2c600 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
2c610 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2c620 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2c630 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
2c640 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2c650 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c660 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
2c670 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
2c680 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2c690 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
2c6a0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
2c6b0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2c6c0 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
2c6d0 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2c6e0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2c6f0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
2c700 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
2c710 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
2c720 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
2c730 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
2c740 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
2c750 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
2c760 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
2c770 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2c780 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
2c790 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
2c7a0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
2c7b0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
2c7c0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
2c7d0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
2c7e0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2c7f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2c800 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2c810 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
2c820 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
2c830 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
2c840 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
2c850 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73  ->iLimit==0 && s
2c860 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2c870 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
2c880 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
2c890 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64  code(v, sSort.ad
2c8a0 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f  drSortIndex, OP_
2c8b0 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20  SorterOpen);.   
2c8c0 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
2c8d0 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
2c8e0 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
2c8f0 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65  * Open an epheme
2c900 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ral index to use
2c910 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
2c920 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
2c930 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2c940 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
2c950 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
2c960 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Tnct = pParse->n
2c970 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74  Tab++;.    sDist
2c980 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20  inct.addrTnct = 
2c990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c9a0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2c9b0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2c9e0 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2ca10 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  )keyInfoFromExpr
2ca20 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
2ca30 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2ca60 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2ca70 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2ca80 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2ca90 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2caa0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2cab0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2cac0 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2cad0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2cae0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2caf0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2cb00 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2cb10 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2cb20 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2cb30 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2cb40 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2cb50 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2cb60 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2cb70 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2cb80 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2cb90 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a  DISTINCT : 0);..
2cba0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
2cbb0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
2cbc0 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2cbd0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2cbe0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2cbf0 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
2cc00 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
2cc30 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
2cc40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2cc50 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2cc60 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2cc70 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2cc80 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2cc90 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2cca0 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2ccb0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2ccc0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2ccd0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2cce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2ccf0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2cd00 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2cd10 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2cd20 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2cd30 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2cd40 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2cd50 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2cd60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2cd70 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2cd80 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2cd90 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2cda0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2cdb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2cdc0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2cdd0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2cde0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2cdf0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2ce00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2ce10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2ce20 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2ce30 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2ce40 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2ce50 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2ce60 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2ce70 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2ce80 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2ce90 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2cea0 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2ceb0 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2cec0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2ced0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2cee0 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2cef0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2cf00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2cf10 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2cf20 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2cf30 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2cf40 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2cf50 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2cf60 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2cf70 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2cf80 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2cf90 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2cfa0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2cfc0 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2cfd0 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cff0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d000 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2d010 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2d020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2d030 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2d040 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d050 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2d060 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2d070 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2d080 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2d090 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2d0a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2d0b0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2d0c0 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2d0d0 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2d0e0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2d0f0 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2d100 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2d110 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2d120 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2d130 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2d140 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2d150 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2d160 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2d170 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2d180 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2d190 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2d1a0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2d1b0 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2d1c0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2d1d0 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2d1e0 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2d1f0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2d200 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2d210 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2d220 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2d230 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d250 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2d260 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2d270 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2d280 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2d290 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2d2a0 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2d2b0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2d2c0 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2d2d0 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2d2e0 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2d2f0 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2d300 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2d310 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2d320 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2d330 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2d340 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2d350 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2d360 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2d370 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2d380 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2d390 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2d3a0 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2d3b0 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2d3c0 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2d3d0 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2d3e0 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2d3f0 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2d400 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2d410 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2d420 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2d430 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2d440 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2d450 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2d460 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2d470 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2d480 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2d4b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2d4c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2d4d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2d4e0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2d4f0 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2d500 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2d510 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2d520 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2d530 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2d540 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2d550 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2d560 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2d570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d580 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2d590 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2d5a0 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2d5b0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2d5c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2d5d0 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2d5e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2d5f0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
2d600 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2d610 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
2d620 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2d630 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
2d640 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2d650 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
2d660 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
2d670 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
2d680 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
2d690 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
2d6a0 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
2d6b0 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
2d6c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2d6d0 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
2d6e0 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
2d6f0 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
2d700 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
2d710 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
2d720 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
2d730 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
2d740 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
2d750 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
2d760 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2d770 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2d780 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2d790 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2d7a0 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2d7b0 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2d7c0 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2d7d0 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2d7e0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2d7f0 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2d800 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2d810 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2d820 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2d830 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2d840 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2d850 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2d860 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2d870 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2d880 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2d890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2d8a0 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2d8b0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2d8c0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2d8d0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2d8e0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2d8f0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2d900 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2d910 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2d920 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2d930 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2d940 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2d950 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2d960 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2d970 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2d980 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2d990 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2d9a0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2d9b0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2d9c0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2d9d0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2d9e0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2d9f0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2da00 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2da10 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2da20 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2da30 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2da40 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2da50 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2da60 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2da70 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2da80 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2da90 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2daa0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2dab0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2dac0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2dad0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2dae0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2daf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2db00 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2db10 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2db20 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2db30 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2db40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2db50 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2db60 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2db70 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2db80 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2db90 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2dba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2dbb0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2dbc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2dbd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2dbe0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2dbf0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2dc00 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2dc10 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2dc20 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2dc30 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2dc40 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2dc50 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2dc60 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2dc70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2dc80 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2dc90 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2dca0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2dcb0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2dcc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2dcd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2dce0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2dcf0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2dd00 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2dd10 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2dd20 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2dd30 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2dd40 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2dd50 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2dd60 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2dd70 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2dd80 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2dd90 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2dda0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2ddb0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2ddc0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2ddd0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2dde0 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20      int addr1;  
2ddf0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2de00 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2de10 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2de20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2de30 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2de40 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2de50 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2de60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2de70 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2de80 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2de90 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2dea0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2deb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2dec0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2ded0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2dee0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2def0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2df00 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2df10 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2df20 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2df30 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2df40 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2df50 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2df60 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2df70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2df80 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2df90 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2dfa0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2dfb0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2dfc0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2dfd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2dfe0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2dff0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2e000 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2e010 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2e020 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2e030 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2e040 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2e050 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2e060 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2e070 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2e080 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2e090 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2e0a0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2e0b0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2e0c0 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2e0d0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2e0e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2e0f0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2e100 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2e110 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2e120 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2e130 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2e140 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2e150 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2e160 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2e170 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
2e180 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
2e190 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2e1a0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2e1b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2e1c0 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2e1d0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2e1e0 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2e1f0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2e200 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2e210 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2e220 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2e230 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2e240 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2e250 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2e260 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2e270 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2e280 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2e290 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2e2a0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2e2b0 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2e2c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2e2d0 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2e2e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2e2f0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2e300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2e310 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2e320 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2e330 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2e340 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2e350 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2e360 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2e370 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2e380 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2e390 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2e3a0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2e3b0 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2e3c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2e3d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2e3e0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2e3f0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2e400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e410 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2e420 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2e430 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2e440 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2e450 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2e460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e470 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e480 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2e490 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2e4a0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2e4b0 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2e4c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e4d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e4e0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2e4f0 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2e500 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2e510 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2e520 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2e530 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2e540 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2e550 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2e560 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2e570 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2e580 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2e590 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2e5a0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2e5b0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2e5c0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2e5d0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2e5e0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2e5f0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2e600 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2e610 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2e620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2e630 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e640 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2e650 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2e660 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2e670 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e680 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2e690 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2e6a0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2e6b0 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2e6c0 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2e6d0 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2e6e0 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2e6f0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2e700 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2e710 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2e720 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2e730 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2e740 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2e750 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2e760 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2e770 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2e780 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2e790 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2e7a0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2e7b0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2e7c0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2e7d0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2e7e0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2e7f0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2e800 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2e810 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2e820 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2e830 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2e840 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2e850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e860 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2e870 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2e880 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2e890 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2e8a0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2e8b0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2e8c0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2e8d0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2e8e0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2e8f0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2e900 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2e910 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2e920 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2e930 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2e940 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2e950 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2e960 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2e970 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2e980 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2e990 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2e9a0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2e9b0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2e9c0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2e9d0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2e9e0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2e9f0 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2ea00 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ea20 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2ea30 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2ea40 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2ea50 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2ea60 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2ea70 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2ea80 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2ea90 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2eaa0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2eab0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2eac0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2ead0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2eae0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2eaf0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2eb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2eb10 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2eb20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2eb30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2eb40 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2eb50 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2eb60 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2eb70 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2eb80 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2eb90 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2eba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2ebb0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2ebc0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2ebd0 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Base, 0, 0);.   
2ebe0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2ebf0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2ec00 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2ec10 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2ec20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2ec30 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2ec40 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2ec50 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2ec60 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2ec70 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2ec80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2ec90 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ecb0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
2ecc0 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
2ecd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecf0 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43    pCol->pTab, pC
2ed00 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f  ol->iColumn, pCo
2ed10 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a  l->iTable, r1);.
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2ed30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ed40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2ed50 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
2ed60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2ed70 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2ed80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2ed90 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2eda0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
2edb0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2edc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2edd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ede0 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
2edf0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2ee00 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2ee10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2ee20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
2ee30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2ee40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2ee50 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2ee60 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
2ee70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2ee80 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2ee90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
2eea0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2eeb0 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
2eec0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
2eed0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
2eee0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
2eef0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
2ef00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ef10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2ef20 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
2ef30 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
2ef40 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2ef50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ef60 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
2ef70 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2ef80 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
2ef90 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2efa0 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
2efb0 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62   BY sort")); Vdb
2efc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2efd0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
2efe0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
2eff0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f000 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2f010 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
2f020 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
2f030 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70  he index or temp
2f040 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64  orary table used
2f050 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59   by the GROUP BY
2f060 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77   sort.      ** w
2f070 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65  ill naturally de
2f080 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68  liver rows in th
2f090 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64  e order required
2f0a0 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59   by the ORDER BY
2f0b0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
2f0c0 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68  , cancel the eph
2f0d0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65  emeral table ope
2f0e0 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e  n coded earlier.
2f0f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2f100 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
2f110 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
2f120 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
2f130 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
2f140 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20  gardless..      
2f150 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
2f160 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
2f170 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
2f180 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2f190 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ER to .      ** 
2f1a0 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
2f1b0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
2f1c0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
2f1d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72   */.      if( or
2f1e0 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69  derByGrp && Opti
2f1f0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2f200 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
2f210 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20  ByOrder) .      
2f220 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74   && (groupBySort
2f230 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65   || sqlite3Where
2f240 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29  IsSorted(pWInfo)
2f250 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2f260 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2f270 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  y = 0;.        s
2f280 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2f290 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2f2a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2f2b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2f2c0 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
2f2d0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2f2e0 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
2f2f0 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
2f300 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
2f310 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2f320 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
2f330 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
2f340 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
2f350 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
2f360 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2f370 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
2f380 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
2f390 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
2f3a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
2f3b0 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
2f3c0 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
2f3d0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
2f3e0 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
2f3f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2f400 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2f410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f420 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2f430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
2f440 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2f450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f460 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
2f470 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
2f480 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  .sortingIdx,.   
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20         sortOut, 
2f4b0 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20  sortPTab);.     
2f4c0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2f4d0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
2f4e0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
2f4f0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2f500 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
2f510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f520 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2f530 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
2f540 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
2f550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f560 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
2f570 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2f580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2f590 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
2f5a0 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
2f5b0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2f5c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f5d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f5e0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
2f5f0 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
2f600 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2f610 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2f620 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2f630 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
2f640 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
2f650 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2f660 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
2f670 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2f680 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2f690 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f6a0 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31  , OP_Jump, addr1
2f6b0 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b  +1, 0, addr1+1);
2f6c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f6d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2f6e0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
2f6f0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
2f700 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
2f710 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
2f720 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
2f730 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
2f740 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2f750 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
2f760 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
2f770 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
2f780 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
2f790 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
2f7a0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
2f7b0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
2f7c0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
2f7d0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
2f7e0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
2f7f0 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
2f800 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
2f810 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2f820 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
2f830 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
2f840 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2f850 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
2f860 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
2f870 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
2f880 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
2f890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2f8a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
2f8b0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
2f8c0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
2f8d0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2f8e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f8f0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2f900 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2f910 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2f920 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f930 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
2f940 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
2f950 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f960 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
2f970 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
2f980 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2f990 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f9a0 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
2f9b0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2f9c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f9d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2f9e0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2f9f0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2fa00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fa10 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
2fa20 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2fa30 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
2fa40 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2fa50 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
2fa60 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
2fa70 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2fa80 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
2fa90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2faa0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
2fab0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
2fac0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2fad0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2fae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2faf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2fb00 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
2fb10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2fb20 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
2fb30 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
2fb40 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
2fb50 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
2fb60 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
2fb70 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2fb80 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
2fb90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fba0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
2fbb0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2fbc0 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
2fbd0 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  fLoop);.        
2fbe0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2fbf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fc00 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2fc10 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2fc20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fc30 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2fc40 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
2fc50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2fc60 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
2fc70 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
2fc80 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
2fc90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fca0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2fcb0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
2fcc0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2fcd0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fce0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
2fcf0 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
2fd00 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
2fd10 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
2fd20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2fd30 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2fd40 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
2fd50 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2fd60 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2fd70 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
2fd80 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2fd90 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2fda0 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
2fdb0 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
2fdc0 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
2fdd0 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
2fde0 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
2fdf0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
2fe00 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
2fe10 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
2fe20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
2fe30 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
2fe40 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
2fe50 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
2fe60 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
2fe70 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
2fe80 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
2fe90 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
2fea0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
2feb0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
2fec0 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
2fed0 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
2fee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
2fef0 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
2ff00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2ff10 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2ff20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ff30 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2ff40 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2ff50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ff60 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
2ff70 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2ff80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2ff90 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2ffa0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2ffb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2ffc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2ffd0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2ffe0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2fff0 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
30000 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
30010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30020 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
30030 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
30040 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
30050 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
30060 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
30070 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
30080 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
30090 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
300a0 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
300b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
300c0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
300d0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
300e0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
300f0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
30100 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
30110 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
30120 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
30130 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
30140 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
30150 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
30160 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
30170 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
30180 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
30190 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
301a0 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69           &sDisti
301b0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301d0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
301e0 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
301f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30200 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30210 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
30220 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
30230 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
30240 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
30250 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
30260 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
30270 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
30280 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
30290 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
302a0 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
302b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
302c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
302d0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
302e0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
302f0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
30300 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
30310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30320 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
30330 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
30340 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
30350 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
30360 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
30370 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
30380 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
30390 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
303a0 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
303b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
303c0 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
303d0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
303e0 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
303f0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
30400 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
30410 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30420 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
30430 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
30440 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
30450 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
30460 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
30470 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
30480 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
30490 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
304a0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
304b0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
304c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
304d0 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
304e0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
304f0 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
30500 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
30510 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30520 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
30530 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
30540 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
30550 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
30560 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
30570 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
30580 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
30590 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
305a0 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
305b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
305c0 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
305d0 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
305e0 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
305f0 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
30600 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
30610 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
30620 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
30630 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
30640 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
30650 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
30660 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
30670 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
30680 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
30690 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
306a0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
306b0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
306c0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
306d0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
306e0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
306f0 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
30700 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
30710 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
30720 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
30730 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
30740 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
30750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
30760 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
30770 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
30780 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
30790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
307a0 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
307b0 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
307c0 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
307d0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
307e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
307f0 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
30800 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
30810 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
30820 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
30830 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
30840 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
30850 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
30860 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
30870 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
30880 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
30890 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
308a0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
308b0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
308c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
308d0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
308e0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
308f0 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74  t has the lowest
30900 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20   scan cost..    
30910 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30920 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
30930 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
30940 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
30950 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
30960 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30970 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44  * (2013-10-03) D
30980 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20  o not count the 
30990 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72  entries in a par
309a0 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20  tial index..    
309b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
309c0 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
309d0 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
309e0 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
309f0 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
30a00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
30a10 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
30a20 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
30a30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30a40 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
30a50 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20  pTab) ) pBest = 
30a60 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
30a70 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
30a80 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
30a90 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
30aa0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
30ab0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
30ac0 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
30ad0 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
30ae0 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64     && pIdx->szId
30af0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
30b00 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  Row.           &
30b10 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  & pIdx->pPartIdx
30b20 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20  Where==0.       
30b30 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c      && (!pBest |
30b40 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  | pIdx->szIdxRow
30b50 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77  <pBest->szIdxRow
30b60 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
30b70 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
30b80 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
30b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30ba0 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
30bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
30bc0 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
30bd0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
30be0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
30bf0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
30c00 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
30c10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
30c20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
30c30 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
30c40 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
30c50 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
30c60 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
30c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30c80 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  4Int(v, OP_OpenR
30c90 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
30ca0 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
30cb0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
30cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
30cd0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
30ce0 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
30cf0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
30d00 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d  INFO);.        }
30d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30d20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30d30 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
30d40 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
30d50 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
30d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
30d70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
30d80 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  sr);.        exp
30d90 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
30da0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42  pParse, pTab, pB
30db0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
30dc0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
30dd0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
30de0 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  NT */.      {.  
30df0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
30e00 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
30e10 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
30e20 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
30e30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
30e40 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
30e50 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
30e60 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
30e70 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
30e80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30e90 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
30ea0 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
30eb0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
30ec0 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
30ed0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20   results.       
30ee0 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
30ef0 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
30f00 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
30f10 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
30f20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20   .        ** If 
30f30 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
30f40 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
30f50 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
30f60 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
30f70 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
30f80 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
30f90 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
30fa0 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
30fb0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
30fc0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
30fd0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
30fe0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
30ff0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
31000 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
31010 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
31020 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
31030 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
31040 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mum .        ** 
31050 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
31060 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
31070 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  d)..        **. 
31080 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63         ** A spec
31090 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
310a0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
310b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
310c0 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
310d0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
310e0 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73  avior as follows
310f0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
31100 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
31110 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
31120 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
31130 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
31140 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
31150 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
31160 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
31170 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
31180 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
31190 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
311a0 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
311b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
311c0 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
311d0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
311e0 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
311f0 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
31200 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
31210 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
31220 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
31230 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
31240 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
31250 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
31260 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
31270 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
31280 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
31290 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
312a0 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
312b0 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
312c0 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
312d0 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
312e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
312f0 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
31300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
31310 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  flag = WHERE_ORD
31320 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
31330 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73       .        as
31340 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
31350 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
31360 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
31370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
31380 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a  ->pHaving==0 ){.
31390 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
313a0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41   minMaxQuery(&sA
313b0 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78  ggInfo, &pMinMax
313c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
313d0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
313e0 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78  g==0 || (pMinMax
313f0 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e  !=0 && pMinMax->
31400 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20  nExpr==1) );..  
31410 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
31420 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
31430 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
31440 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69  rListDup(db, pMi
31450 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  nMax, 0);.      
31460 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
31470 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
31480 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
31490 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
314a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
314b0 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
314c0 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
314d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
314e0 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
314f0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
31500 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
31510 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
31520 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
31530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
31540 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
31550 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
31560 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
31570 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
31580 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
31590 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
315a0 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
315b0 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
315c0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
315d0 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
315e0 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
315f0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
31600 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31610 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
31620 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
31630 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
31640 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
31650 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20  x,0,flag,0);.   
31660 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
31670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31680 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31690 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
316a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
316b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
316c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70      }.        up
316d0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
316e0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
316f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  o);.        asse
31700 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  rt( pMinMax==0 |
31710 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  | pMinMax->nExpr
31720 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==1 );.        i
31730 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
31740 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
31750 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
31760 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
31770 76 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  v, sqlite3WhereB
31780 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
31790 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
317a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
317b0 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
317d0 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
317e0 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
317f0 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
31800 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31810 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
31820 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
31830 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
31840 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
31850 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
31860 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
31870 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
31880 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
31890 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
318a0 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
318b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
318c0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
318d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
318e0 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c  ->pEList, -1, 0,
318f0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
31900 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
31910 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
31920 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
31930 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
31940 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
31950 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
31960 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
31970 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
31980 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
31990 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
319a0 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74  .  if( sDistinct
319b0 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  .eTnctType==WHER
319c0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
319d0 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c  ERED ){.    expl
319e0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
319f0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
31a00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
31a10 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
31a20 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
31a30 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
31a40 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
31a50 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
31a60 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
31a70 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
31a80 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
31a90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
31aa0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
31ab0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
31ac0 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74             sSort
31ad0 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
31ae0 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
31af0 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
31b00 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
31b10 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
31b20 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
31b30 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
31b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
31b50 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
31b60 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
31b70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
31b80 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
31b90 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
31ba0 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
31bb0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
31bc0 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
31bd0 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20  rse structure,. 
31be0 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75   ** set the retu
31bf0 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74  rn code to 1. Ot
31c00 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20  herwise 0. */.  
31c10 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45  rc = (pParse->nE
31c20 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  rr>0);..  /* Con
31c30 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
31c40 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
31c50 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
31c60 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
31c70 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
31c80 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
31c90 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
31ca0 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
31cb0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
31cc0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
31cd0 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
31ce0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
31cf0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
31d00 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
31d10 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
31d20 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
31d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31d40 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31d50 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
31d60 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
31d70 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
31d80 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
31d90 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
31da0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
31db0 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
31dc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
31dd0 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69  gInfo.aFunc);.#i
31de0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
31df0 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52  ABLED.  SELECTTR
31e00 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
31e10 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c  "end processing\
31e20 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  n"));.  pParse->
31e30 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b  nSelectIndent--;
31e40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
31e50 20 72 63 3b 0a 7d 0a                              rc;.}.