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

Artifact f8fded11fc443a9f5a73cc5db069d06b34460e2f:


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 61 73 73 65 72 74 28 20 70  dif..  assert( p
b7f0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
b800: 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
b810: 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63  st!=0 );.  switc
b820: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b830: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
b840: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
b850: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
b860: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b870: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b880: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
b890: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
b8a0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
b8b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b8c0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
b8d0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
b8e0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
b8f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
b900: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
b910: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
b920: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
b930: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
b940: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
b950: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
b960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
b970: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b980: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
b990: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
b9a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b9b0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b9c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
b9d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
b9e0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
b9f0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
ba00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ba10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
ba20: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
ba30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ba40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
ba50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
ba60: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
ba70: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
ba80: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
ba90: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
baa0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
bab0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
bac0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
bad0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
bae0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
baf0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
bb00: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
bb10: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
bb20: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
bb30: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
bb40: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
bb50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
bb60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
bb70: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
bb80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
bba0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
bbb0: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
bbc0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
bbd0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
bbe0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
bbf0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
bc00: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
bc10: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
bc20: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
bc30: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
bc40: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
bc50: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
bc60: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
bc70: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
bc80: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
bc90: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
bca0: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
bcb0: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
bcc0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
bcd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
bce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
bcf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
bd00: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
bd10: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
bd20: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
bd30: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
bd40: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
bd50: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
bd60: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
bd70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
bd80: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
bd90: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
bda0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
bdb0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
bdc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
bdd0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
bde0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
bdf0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
be00: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
be10: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
be20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
be30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
be40: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
be50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
be60: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
be70: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
be80: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
be90: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
bea0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
beb0: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
bec0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
bed0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
bee0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
bef0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
bf00: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
bf10: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
bf20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bf30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
bf40: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
bf50: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
bf60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
bf70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
bf80: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
bf90: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
bfa0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
bfb0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
bfc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
bfd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
bfe0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
bff0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c000: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
c010: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
c020: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
c030: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
c040: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
c050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c060: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
c070: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
c080: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
c090: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
c0a0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
c0b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
c0c0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
c0d0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
c0e0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
c0f0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
c100: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
c110: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
c120: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
c130: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
c140: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
c150: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
c160: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  LL..          **
c170: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
c180: 65 20 41 4c 57 41 59 53 28 29 20 69 73 20 62 65  e ALWAYS() is be
c190: 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e  cause iCol>=pS->
c1a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 77 69  pEList->nExpr wi
c1b0: 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20  ll have been.   
c1c0: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67 68 74         ** caught
c1d0: 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61 6d 65   already by name
c1e0: 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20   resolution..   
c1f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c200: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c210: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
c220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c230: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
c240: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
c250: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c260: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
c270: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
c280: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c290: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c2a0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
c2b0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
c2c0: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
c2d0: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
c2e0: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
c2f0: 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  th); .        }.
c300: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c310: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
c320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
c330: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
c340: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
c350: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c360: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
c370: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
c380: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
c390: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
c3a0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
c3b0: 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53  Col) );.#ifdef S
c3c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c3d0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
c3e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c400: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c410: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
c420: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
c430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c440: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c450: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c460: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c470: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
c480: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
c490: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  me;.          es
c4a0: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c4b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c4c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
c4e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
c4f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
c500: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
c510: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
c520: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
c530: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
c540: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
c550: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44            zOrigD
c560: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
c570: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
c580: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
c590: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
c5a0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c5b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c5c0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c5e0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
c5f0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
c600: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c610: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c620: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c630: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
c640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c650: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c660: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c670: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
c680: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c690: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c6a0: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
c6b0: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
c6c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c6d0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
c6e0: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
c6f0: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
c700: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c710: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
c720: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
c730: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
c740: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c750: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
c760: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
c770: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
c780: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c790: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c7a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c7b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c7c0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
c7d0: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
c7e0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c7f0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
c800: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c810: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c820: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c830: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c840: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c850: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
c860: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
c870: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
c880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c890: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
c8a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c8b0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c8c0: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
c8d0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c8e0: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
c8f0: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
c900: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
c910: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
c920: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
c930: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
c940: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
c950: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
c960: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
c970: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
c980: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
c990: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c9a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
c9b0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
c9c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c9d0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
c9e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c9f0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
ca00: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
ca10: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
ca20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
ca30: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ca40: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
ca50: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ca60: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
ca70: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ca80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ca90: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
caa0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
cab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cac0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
cad0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
cae0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
caf0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
cb00: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
cb10: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
cb20: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
cb30: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
cb40: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
cb50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
cb60: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
cb70: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
cb80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
cb90: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
cba0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
cbb0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
cbc0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
cbd0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
cbe0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
cbf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cc00: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
cc10: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
cc20: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
cc30: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
cc40: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
cc50: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
cc60: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
cc70: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
cc80: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
cc90: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
cca0: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
ccb0: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
ccc0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
ccd0: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
cce0: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
ccf0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
cd00: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
cd10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cd20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cd30: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
cd40: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
cd50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
cd60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cd70: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cd80: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
cd90: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cda0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cdb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cdc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
cdd0: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
cde0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cdf0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
ce00: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
ce10: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
ce20: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ce40: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ce50: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
ce60: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
ce70: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
ce80: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ce90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
cea0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TYPE) */.}../*.*
ceb0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cec0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
ced0: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
cee0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
cef0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cf00: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
cf10: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
cf20: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
cf30: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
cf40: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
cf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
cf60: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
cf70: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
cf80: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
cf90: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
cfa0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
cfb0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
cfc0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
cfd0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
cfe0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
cff0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
d000: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
d010: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d020: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
d030: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
d040: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d050: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
d060: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
d070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d080: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
d090: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
d0a0: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
d0b0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
d0c0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
d0d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d0e0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
d0f0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
d100: 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  t || db->mallocF
d110: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
d120: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
d130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
d140: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61  List!=0 );.  pPa
d150: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
d160: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
d170: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
d180: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
d190: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72  ames)!=0;.  shor
d1a0: 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  tNames = (db->fl
d1b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
d1c0: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  rtColNames)!=0;.
d1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d1e0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
d1f0: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
d200: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
d210: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d220: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
d230: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
d240: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45  Expr;.    if( NE
d250: 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74  VER(p==0) ) cont
d260: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
d270: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d280: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
d290: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
d2a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
d2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d2c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d2d0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
d2e0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
d2f0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
d300: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
d310: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
d320: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
d330: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
d340: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
d350: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
d360: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
d370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
d380: 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69   ALWAYS(j<pTabLi
d390: 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b  st->nSrc); j++){
d3a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
d3b0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
d3c0: 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29  sor==p->iTable )
d3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d3e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
d3f0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
d400: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
d410: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
d420: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
d430: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
d440: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
d450: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
d460: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
d470: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d480: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
d490: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d4a0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
d4b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d4c0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
d4d0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
d4e0: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
d4f0: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
d500: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
d510: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d520: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d530: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d540: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
d550: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44     sqlite3DbStrD
d560: 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
d570: 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49  [i].zSpan), SQLI
d580: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d590: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
d5a0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
d5b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
d5c0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
d5d0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d5e0: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
d5f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
d600: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d610: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d620: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d630: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
d640: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d670: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d680: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
d690: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d6a0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
d6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d6c0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
d6d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d6e0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
d6f0: 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
d700: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
d710: 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
d720: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
d730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d740: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d750: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d760: 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
d770: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
d780: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d790: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
d7a0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
d7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d7c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
d7d0: 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c  t (which is real
d7e0: 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ly the list of e
d7f0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
d800: 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75  at form the resu
d810: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
d820: 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f  CT statement) co
d830: 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74  mpute appropriat
d840: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e.** column name
d850: 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68  s for a table th
d860: 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  at would hold th
d870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
d880: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c  t..**.** All col
d890: 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62  umn names will b
d8a0: 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20  e unique..**.** 
d8b0: 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Only the column 
d8c0: 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74  names are comput
d8d0: 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70  ed.  Column.zTyp
d8e0: 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c  e, Column.zColl,
d8f0: 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
d900: 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61  elds of Column a
d910: 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
d920: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d930: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
d940: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
d950: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
d960: 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c  rs,.** store NUL
d970: 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20  L in *paCol and 
d980: 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20  0 in *pnCol and 
d990: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d9a0: 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
d9b0: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
d9c0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d9d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d9e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d9f0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
da00: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
da10: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
da20: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
da30: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
da40: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
da50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
da60: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
da70: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
da80: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
da90: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
daa0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
dab0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
dac0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
dad0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
dae0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
daf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
db00: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db20: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
db30: 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db50: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
db60: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
db70: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
db80: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
db90: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
dba0: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
dbb0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
dbc0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
dbe0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
dbf0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
dc00: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
dc30: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
dc40: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
dc50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc70: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
dc80: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dca0: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
dcb0: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
dcc0: 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
dce0: 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
dcf0: 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
dd00: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
dd10: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
dd20: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
dd30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
dd40: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
dd50: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
dd60: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
dd70: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
dd80: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
dd90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
dda0: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
ddb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
ddc0: 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43  t( nCol==(i16)nC
ddd0: 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ol );.  *pnCol =
dde0: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
ddf0: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
de00: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
de10: 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61  <nCol && !db->ma
de20: 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c  llocFailed; i++,
de30: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
de40: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
de50: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
de60: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
de70: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
de80: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
de90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
dea0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
deb0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
dec0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
ded0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
dee0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
def0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
df00: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
df10: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
df20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df30: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
df40: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
df50: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
df60: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
df70: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
df80: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
df90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
dfa0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
dfb0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
dfc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
dfd0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
dfe0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
dff0: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
e000: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
e010: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
e020: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
e030: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
e040: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
e050: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
e060: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
e070: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
e080: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
e090: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
e0a0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
e0b0: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
e0c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
e0d0: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
e0e0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
e0f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e100: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e110: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
e120: 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
e130: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
e140: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
e150: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e160: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
e170: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
e180: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
e190: 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
e1a0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
e1b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
e1c0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
e1d0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
e1e0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
e1f0: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
e200: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
e210: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
e220: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
e230: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
e240: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
e250: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e260: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
e270: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
e280: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  ", zName);..    
e290: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e2a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
e2b0: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
e2c0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
e2d0: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
e2e0: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
e2f0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
e300: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
e310: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
e320: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
e330: 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
e340: 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
e350: 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
e360: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
e370: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
e380: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
e390: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
e3a0: 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
e3b0: 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
e3c0: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
e3d0: 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
e3e0: 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
e3f0: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
e400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
e410: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e420: 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
e430: 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
e440: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
e450: 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
e460: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e470: 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
e480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
e490: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
e4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
e4b0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
e4c0: 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
e4d0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
e4e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
e4f0: 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
e500: 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
e510: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
e520: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
e530: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
e540: 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66  Clear(&ht);.  if
e550: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e560: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
e570: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
e580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e590: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
e5a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
e5b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e5c0: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
e5d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
e5e0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
e5f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e620: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e630: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e640: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e650: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e660: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e670: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e680: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e690: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e6a0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e6b0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e6c0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e6d0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e6e0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e6f0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e700: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e710: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e720: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e730: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e740: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e750: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e760: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e770: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e780: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e790: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e7a0: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e7b0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e7c0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e7d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e7e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e7f0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e800: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e810: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e820: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
e830: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
e840: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e850: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
e860: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
e870: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
e880: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
e890: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e8a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
e8b0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
e8c0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
e8d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
e8e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
e8f0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
e900: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
e910: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
e920: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
e930: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
e940: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
e950: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
e960: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
e970: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e980: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
e990: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
e9a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e9b0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e9c0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e9d0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
e9e0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
e9f0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
ea00: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
ea10: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
ea20: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
ea30: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
ea40: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
ea50: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ea60: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
ea70: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
ea80: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b  Col->zType==0 ){
ea90: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  .      pCol->zTy
eaa0: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
eab0: 72 44 75 70 28 64 62 2c 20 0a 20 20 20 20 20 20  rDup(db, .      
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e    columnType(&sN
eae0: 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f  C, p,0,0,0, &pCo
eaf0: 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20  l->szEst));.    
eb00: 7d 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70  }.    szAll += p
eb10: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20  Col->szEst;.    
eb20: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
eb30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
eb40: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
eb50: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
eb60: 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
eb70: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
eb80: 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
eb90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
eba0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
ebb0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
ebc0: 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
ebd0: 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
ebe0: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
ebf0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
ec00: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
ec10: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
ec20: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
ec30: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
ec40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
ec50: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
ec60: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
ec70: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
ec80: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
ec90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
eca0: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
ecb0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
ecc0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
ecd0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
ece0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
ecf0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
ed00: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
ed10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ed20: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
ed30: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
ed40: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
ed50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
ed60: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
ed70: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
ed80: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
ed90: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
eda0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
edb0: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
edc0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
edd0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
ede0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
edf0: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
ee00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
ee10: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
ee20: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
ee30: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
ee40: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
ee50: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
ee60: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
ee70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ee80: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
ee90: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
eea0: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
eeb0: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
eec0: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
eed0: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
eee0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
eef0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
ef00: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
ef10: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
ef20: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ab->zName = 0;. 
ef30: 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
ef40: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
ef50: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
ef60: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
ef70: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
ef80: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
ef90: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45  rse, pSelect->pE
efa0: 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
efb0: 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
efc0: 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  .  selectAddColu
efd0: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
efe0: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
eff0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61   pSelect);.  pTa
f000: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
f010: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
f020: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
f030: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
f040: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72  db, pTab);.    r
f050: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
f060: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
f070: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
f080: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
f090: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
f0a0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
f0b0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
f0c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f0d0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
f0e0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
f0f0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
f100: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
f110: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
f120: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
f130: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f140: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
f150: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
f160: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
f170: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
f180: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20  e);.    if( v ) 
f190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1a0: 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20  0(v, OP_Init);. 
f1b0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
f1c0: 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20  Toplevel==0.    
f1d0: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
f1e0: 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
f1f0: 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
f200: 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b  OutConst).    ){
f210: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  .      pParse->o
f220: 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
f230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72  ;.    }..  }.  r
f240: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
f250: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
f260: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f270: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
f280: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
f290: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
f2a0: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
f2b0: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
f2c0: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
f2d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
f2e0: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
f2f0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
f300: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
f310: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
f320: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
f330: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
f340: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
f350: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
f360: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f370: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
f380: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
f390: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
f3a0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
f3b0: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
f3c0: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
f3d0: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
f3e0: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
f3f0: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
f400: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f410: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
f420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f430: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
f440: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
f450: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
f460: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
f470: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
f480: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
f490: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
f4a0: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
f4b0: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
f4c0: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
f4d0: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
f4e0: 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
f4f0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
f500: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
f510: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
f520: 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
f530: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
f540: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
f550: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
f560: 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
f570: 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
f580: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f590: 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
f5a0: 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
f5b0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f5c0: 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
f5d0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
f5e0: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
f5f0: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
f600: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
f610: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
f620: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
f630: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
f640: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
f650: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
f660: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
f670: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
f680: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
f690: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
f6a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
f6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
f6c0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
f6d0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
f6e0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
f6f0: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
f700: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
f710: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
f720: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e  iOffset;.  int n
f730: 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
f740: 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
f750: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
f760: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
f770: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
f780: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
f790: 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
f7a0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
f7b0: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
f7c0: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
f7d0: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
f7e0: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
f7f0: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
f800: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
f810: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
f820: 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
f830: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
f840: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
f850: 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
f860: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
f870: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
f880: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
f890: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
f8a0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
f8b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
f8c0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
f8d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f8e0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
f8f0: 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
f900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f910: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f920: 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
f930: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
f940: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
f950: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
f960: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
f970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f980: 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29  eGoto(v, iBreak)
f990: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f9a0: 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
f9b0: 6c 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29  lectRow>(u64)n )
f9c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
f9d0: 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20  lectRow = n;.   
f9e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fa00: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
fa10: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
fa20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fa40: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
fa50: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fa60: 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
fa70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
fa80: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
fa90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
faa0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
fab0: 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
fac0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
fad0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
fae0: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
faf0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
fb00: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
fb10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fb20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
fb30: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
fb40: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
fb50: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
fb60: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
fb70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fb80: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
fb90: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
fba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbb0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
fbc0: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
fbd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fbe0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fbf0: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
fc00: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
fc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc20: 33 28 76 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74  3(v, OP_SetIfNot
fc30: 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f  Pos, iOffset, iO
fc40: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  ffset, 0);.     
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc60: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
fc70: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
fc80: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
fc90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fca0: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
fcb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fcc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fcd0: 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20 69 4c  _SetIfNotPos, iL
fce0: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
fcf0: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
fd00: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fd10: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
fd20: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
fd30: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
fd40: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
fd50: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
fd60: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
fd70: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
fd80: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
fd90: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
fda0: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
fdb0: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
fdc0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
fdd0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
fde0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
fdf0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
fe00: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fe10: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
fe20: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
fe30: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
fe40: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
fe50: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
fe60: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
fe70: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
fe80: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
fe90: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
fea0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
feb0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
fec0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
fed0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
fee0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
fef0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
ff00: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
ff10: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
ff20: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
ff30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
ff40: 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
ff50: 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
ff60: 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
ff70: 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
ff80: 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
ff90: 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
ffa0: 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
ffb0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
ffc0: 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
ffd0: 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
ffe0: 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
fff0: 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10000 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10010 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10020 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10030 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10040 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10050 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
10060 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
10070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
10080 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
10090 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
100a0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
100b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
100c0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
100d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
100e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
100f0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10100 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10110 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10120 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10130 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10140 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10150 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10160 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10170 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10180 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10190 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
101a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
101b0 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
101c0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
101d0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
101e0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
101f0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10200 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10210 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10220 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10230 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10240 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10250 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10260 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10270 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10280 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10290 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
102a0 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
102b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
102c0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
102d0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
102e0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
102f0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10300 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10310 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
10320 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
10330 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
10340 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
10350 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
10360 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
10370 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10380 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
10390 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
103a0 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
103b0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
103c0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
103d0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
103e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
103f0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
10400 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
10410 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
10420 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
10430 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10440 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
10450 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
10460 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
10470 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
10480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10490 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
104a0 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
104b0 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
104c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
104d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
104e0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
104f0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
10500 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
10510 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
10520 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
10530 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
10540 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10550 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10560 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10580 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
10590 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
105a0 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
105b0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
105c0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
105d0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
105e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
105f0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
10600 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
10610 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
10620 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
10630 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10660 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
10670 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10680 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
106a0 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
106b0 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
106c0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
106d0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
106e0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
106f0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
10700 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
10710 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
10720 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
10730 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
10740 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
10750 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
10760 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
10770 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
10780 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
10790 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
107a0 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
107b0 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
107c0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
107d0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
107e0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
107f0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
10800 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
10810 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
10820 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
10830 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
10840 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
10850 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
10860 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
10870 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
10880 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
10890 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
108a0 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
108b0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
108c0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
108d0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
108e0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
108f0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
10900 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
10910 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10920 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
10930 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
10940 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
10950 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
10960 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
10970 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
10980 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
10990 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
109a0 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
109b0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
109c0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
109d0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
109e0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
109f0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
10a00 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
10a10 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
10a20 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
10a30 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
10a40 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
10a50 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
10a60 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
10a70 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
10a80 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
10a90 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
10aa0 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
10ab0 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
10ac0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
10ad0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
10ae0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
10af0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
10b00 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
10b10 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
10b20 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
10b30 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
10b40 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
10b50 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
10b60 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
10b70 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
10b80 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
10b90 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
10ba0 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
10bb0 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
10bc0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
10bd0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
10be0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
10bf0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
10c00 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
10c10 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
10c20 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
10c30 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
10c40 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
10c50 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
10c60 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
10c70 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
10c80 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
10c90 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
10ca0 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
10cb0 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
10cc0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
10cd0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
10ce0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
10cf0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
10d00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10d10 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
10d20 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
10d30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10d40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10d50 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10d60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10d70 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
10d80 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
10d90 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
10da0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
10db0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
10dc0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
10dd0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
10de0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
10df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
10e00 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10e10 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
10e20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
10e30 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10e40 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
10e50 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
10e60 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
10e70 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
10e80 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
10e90 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
10ea0 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
10eb0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
10ec0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
10ed0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
10ee0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
10ef0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
10f00 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
10f10 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10f20 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
10f30 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
10f40 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
10f50 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
10f60 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
10f70 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
10f80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10f90 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
10fa0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
10fb0 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
10fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
10fd0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
10fe0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
10ff0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11010 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11020 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11030 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11040 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11050 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
11060 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
11070 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11080 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11090 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
110a0 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
110b0 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
110c0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
110d0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
110e0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
110f0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11120 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11150 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
11160 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11180 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11190 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
111a0 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
111b0 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
111c0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
111d0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
111e0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
111f0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11200 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11210 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11220 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11230 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11240 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11250 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11260 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11270 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11280 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11290 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
112a0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
112b0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
112c0 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
112d0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
112e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
112f0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
11300 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11310 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
11320 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
11330 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f   p->pLimit;.  pO
11340 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
11350 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  et;.  regLimit =
11360 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
11370 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
11380 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
11390 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  t = p->pOffset =
113a0 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
113b0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
113c0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
113d0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
113e0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
113f0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11400 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
11410 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
11420 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
11430 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
11440 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
11450 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
11460 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
11470 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
11480 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
11490 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
114a0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
114b0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
114c0 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
114d0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
114e0 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
114f0 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
11500 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
11510 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
11520 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
11530 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
11540 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
11550 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
11560 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
11570 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
11580 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11590 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
115a0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
115b0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
115c0 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
115d0 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
115e0 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
115f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
11600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
11610 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
11620 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
11630 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
11640 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11650 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
11660 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
11670 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
11680 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
11690 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
116a0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
116b0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
116c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
116d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
116e0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
116f0 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
11700 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
11710 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11720 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11730 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
11740 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
11750 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
11760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11770 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
11780 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11790 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
117a0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
117c0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
117d0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
117e0 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
117f0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11800 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11820 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11830 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
11840 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
11850 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
11860 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
11870 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
11880 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11890 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
118a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
118b0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
118c0 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
118d0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
118e0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
118f0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
11900 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11910 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
11920 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
11930 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11940 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
11950 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
11960 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
11970 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
11980 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
11990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
119a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
119b0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
119c0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
119d0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
119e0 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
119f0 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
11a00 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
11a10 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
11a20 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
11a30 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
11a40 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11a50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11a60 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
11a70 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
11a80 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
11a90 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
11aa0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
11ab0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
11ac0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11ad0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
11ae0 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
11af0 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
11b00 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
11b10 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11b30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
11b40 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
11b50 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
11b60 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
11b70 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11b80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11b90 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
11ba0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
11bb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
11bc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
11bd0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
11be0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
11bf0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11c00 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
11c10 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
11c20 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11c30 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
11c40 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
11c50 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
11c60 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
11c70 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72   p->pEList, iCur
11c80 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
11c90 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
11ca0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
11cb0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
11cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11cd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
11ce0 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
11cf0 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
11d00 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
11d10 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
11d20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11d30 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
11d40 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
11d50 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
11d60 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
11d70 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
11d80 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
11d90 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
11da0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
11db0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11dc0 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
11dd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
11de0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
11df0 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
11e00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11e10 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
11e20 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
11e30 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
11e40 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
11e50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
11e60 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
11e70 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11e80 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
11e90 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
11ea0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
11eb0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
11ec0 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
11ed0 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
11ee0 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
11ef0 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
11f00 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
11f10 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
11f20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11f30 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
11f40 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
11f50 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
11f60 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11f70 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
11f80 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
11f90 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
11fa0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
11fb0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
11fc0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
11fd0 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
11fe0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11ff0 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
12000 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
12010 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
12020 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
12030 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
12040 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12050 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12060 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12070 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12080 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12090 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
120a0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
120b0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
120c0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
120d0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
120e0 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
120f0 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
12100 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
12110 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
12120 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12130 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12140 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12150 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
12160 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
12170 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
12180 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
12190 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
121a0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
121b0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
121c0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
121d0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
121e0 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
121f0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
12200 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
12210 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
12220 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12230 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12240 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12250 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
12260 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
12270 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12280 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
12290 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
122a0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
122b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
122c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
122d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
122e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
122f0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12300 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12310 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12320 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12330 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12340 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12350 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
12360 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
12370 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
12380 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
12390 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
123a0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
123b0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
123c0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
123d0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
123e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
123f0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
12400 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
12410 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
12420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12430 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
12440 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12450 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
12460 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
12470 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
12480 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
12490 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
124a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
124b0 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
124c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
124d0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
124e0 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
124f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
12500 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ++;.  }while(1);
12510 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
12520 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70     pPrior = p->p
12530 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
12540 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  rior = 0;.    rc
12550 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12560 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
12570 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  t);.    p->pPrio
12580 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
12590 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
125a0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
125b0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
125c0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
125d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
125e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
125f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
12600 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
12610 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
12620 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
12630 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
12640 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
12650 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
12660 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
12670 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
12680 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
12690 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
126a0 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
126b0 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
126c0 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
126d0 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
126e0 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
126f0 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
12700 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
12710 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
12720 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
12730 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
12740 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
12750 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
12760 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
12770 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
12780 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
12790 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
127a0 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
127b0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
127c0 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
127d0 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
127e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
127f0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
12800 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
12810 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
12820 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
12830 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
12840 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
12850 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
12860 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
12870 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
12880 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
12890 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
128a0 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
128b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
128e0 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
128f0 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
12900 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
12910 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
12920 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
12930 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
12940 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12950 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
12960 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
12970 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
12980 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
12990 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
129a0 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
129b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
129c0 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
129d0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
129e0 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
129f0 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
12a00 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
12a10 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
12a20 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
12a30 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
12a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
12a50 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
12a60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12a70 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12a80 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12a90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12aa0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12ab0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12ac0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
12ad0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
12ae0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12af0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
12b00 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
12b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12b20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
12b30 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
12b40 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
12b50 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
12b60 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
12b70 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
12b80 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
12b90 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12ba0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
12bb0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
12bc0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
12bd0 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
12be0 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
12bf0 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
12c00 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
12c10 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
12c20 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
12c30 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
12c40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
12c50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
12c60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12c70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12c80 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
12c90 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
12ca0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
12cb0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
12cc0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
12cd0 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
12ce0 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
12cf0 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
12d00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
12d10 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
12d20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
12d30 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
12d40 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
12d50 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
12d60 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
12d70 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
12d80 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
12d90 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
12da0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
12db0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
12dc0 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
12dd0 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
12de0 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
12df0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
12e00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
12e10 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
12e20 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
12e30 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
12e40 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
12e50 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
12e60 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
12e70 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
12e80 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
12e90 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12ea0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12eb0 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
12ec0 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
12ed0 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
12ee0 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
12ef0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
12f00 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12f10 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12f20 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
12f30 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
12f40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12f50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
12f60 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
12f70 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
12f80 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
12f90 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
12fa0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
12fb0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
12fc0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
12fd0 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
12fe0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12ff0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
13000 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
13010 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
13020 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
13030 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
13040 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
13050 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
13060 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
13070 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
13080 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
13090 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
130a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
130b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
130c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
130d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
130e0 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
130f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13110 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
13120 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
13130 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13140 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13150 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
13160 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
13170 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
13180 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
13190 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
131a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
131b0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
131c0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
131d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
131e0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
131f0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13200 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13220 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13230 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13240 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13250 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
13260 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
13270 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
13280 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
13290 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
132a0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
132b0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
132c0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
132d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
132e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
132f0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13300 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13310 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
13320 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
13330 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
13340 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
13350 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13360 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
13370 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
13380 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13390 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
133a0 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
133b0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
133c0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
133d0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
133e0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
133f0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
13400 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13410 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
13420 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
13430 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
13440 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
13450 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
13460 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
13470 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
13480 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
13490 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
134a0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
134b0 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
134c0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
134d0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
134e0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
134f0 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
13500 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
13510 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
13520 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
13530 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
13540 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
13550 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13560 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13570 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13580 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13590 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
135a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
135b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
135c0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
135d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
135e0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
135f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
13600 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
13610 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
13620 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
13630 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
13640 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
13650 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
13660 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
13670 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
13680 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13690 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
136a0 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
136b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
136c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
136d0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
136e0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
136f0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
13700 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
13710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13730 76 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f  v, OP_SetIfNotPo
13740 73 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 70  s, p->iOffset, p
13750 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->iOffset, 0);. 
13760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13770 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13780 5f 41 64 64 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  _Add, p->iLimit,
13790 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 70 2d 3e   p->iOffset, p->
137a0 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
137b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
137c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
137d0 74 49 66 4e 6f 74 50 6f 73 2c 20 70 2d 3e 69 4c  tIfNotPos, p->iL
137e0 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  imit, p->iOffset
137f0 2b 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  +1, -1);.       
13800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13810 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13820 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
13830 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13840 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13850 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
13860 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
13870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13890 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
138a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
138b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
138c0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
138d0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
138e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
138f0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
13900 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
13910 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
13920 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
13930 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
13940 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
13950 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
13960 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69  Row > (u64)nLimi
13970 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t .      ){.    
13980 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
13990 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  w = nLimit;.    
139a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
139b0 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
139c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
139d0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
139e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
139f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13a00 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
13a10 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
13a20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
13a30 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
13a40 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
13a50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
13a60 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
13a70 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
13a80 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
13a90 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
13aa0 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
13ab0 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
13ac0 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
13ad0 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
13ae0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
13af0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
13b00 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
13b10 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
13b20 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
13b30 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
13b40 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
13b50 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
13b60 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
13b70 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
13b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
13b90 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
13ba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13bb0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
13bc0 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
13bd0 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
13be0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
13bf0 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
13c00 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
13c10 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
13c20 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
13c30 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
13c40 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
13c50 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
13c60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
13c70 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
13c80 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
13c90 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
13ca0 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
13cb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13cc0 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
13cd0 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c  ;     /* Not all
13ce0 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
13cf0 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
13d00 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
13d10 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
13d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d30 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
13d40 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
13d50 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
13d60 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
13d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
13d80 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
13d90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13da0 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
13db0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13dd0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
13de0 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
13df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13e00 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
13e10 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
13e20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
13e30 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
13e40 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
13e50 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64  ;.        p->add
13e60 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
13e70 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  ddr;.        fin
13e80 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
13e90 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
13ea0 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
13eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13ec0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
13ed0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13ee0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13ef0 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
13f00 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
13f10 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
13f20 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
13f40 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
13f50 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
13f60 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
13f70 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13f80 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
13f90 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13fa0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13fb0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
13fc0 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
13fd0 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  ndest);.      if
13fe0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
13ff0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14000 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14010 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14020 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14030 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
14040 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
14050 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
14060 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  {.        op = S
14070 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20  RT_Except;.     
14080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14090 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
140a0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
140b0 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
140c0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
140d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
140e0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
140f0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
14100 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14110 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
14120 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
14130 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
14140 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74  .      uniondest
14150 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20  .eDest = op;.   
14160 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14170 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14180 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14190 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
141a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
141b0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
141c0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
141d0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
141e0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  OK );.      /* Q
141f0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
14200 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
14210 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
14220 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
14230 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
14240 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
14250 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
14260 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
14270 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
14280 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
14290 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
142a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70  rderBy);.      p
142b0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
142c0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
142d0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
142e0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
142f0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
14300 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14310 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
14320 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
14330 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
14340 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
14350 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
14360 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14370 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
14380 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
14390 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
143a0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
143b0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
143c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
143d0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
143e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
143f0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
14400 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
14410 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
14420 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
14430 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
14440 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
14450 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
14460 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
14470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
14480 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
14490 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
144a0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
144b0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
144c0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
144d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
144e0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
144f0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
14500 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
14510 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
14520 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
14530 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
14540 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
14550 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
14560 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
14570 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
14580 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
14590 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
145a0 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
145b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
145c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
145d0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
145e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
145f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
14600 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14610 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
14620 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14640 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
14650 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
14660 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14670 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
14680 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
14690 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
146a0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
146b0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
146c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
146d0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
146f0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
14700 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
14710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14720 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14730 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
14740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14750 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
14760 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
14770 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14790 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
147a0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
147b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
147c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
147d0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
147e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
147f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14800 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
14810 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
14820 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
14830 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
14840 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
14850 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14860 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
14870 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
14880 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14890 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
148a0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
148b0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
148c0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
148d0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
148e0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
148f0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
14900 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
14910 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
14920 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
14930 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
14940 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
14950 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
14960 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
14970 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14980 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
14990 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
149a0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
149b0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
149c0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
149d0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
149e0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
149f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14a00 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
14a10 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14a20 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
14a30 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
14a40 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14a50 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
14a60 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
14a70 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
14a80 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
14a90 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
14aa0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
14ab0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14ac0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
14ad0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
14ae0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
14af0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
14b00 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14b10 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
14b20 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
14b30 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
14b40 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14b50 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
14b60 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14b70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14b80 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14b90 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
14ba0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
14bb0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14bc0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
14bd0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14be0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
14bf0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
14c00 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
14c10 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
14c20 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
14c30 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14c40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14c50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
14c60 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
14c70 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
14c80 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
14c90 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
14ca0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
14cb0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
14cc0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14cd0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14ce0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
14cf0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
14d00 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
14d10 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
14d20 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14d30 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
14d40 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
14d50 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14d60 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
14d70 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14d80 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14d90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14da0 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
14db0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14dc0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14dd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14de0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14df0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14e00 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14e10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
14e20 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
14e30 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
14e40 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
14e50 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14e70 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14e80 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14e90 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14ea0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14eb0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
14ec0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
14ed0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
14ee0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
14ef0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
14f00 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
14f10 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
14f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14f30 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14f40 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14f50 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14f60 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
14f70 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
14f80 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
14f90 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
14fa0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
14fb0 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
14fc0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14fd0 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
14fe0 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
14ff0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15000 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15010 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15020 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15030 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15040 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15050 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15060 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15070 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15090 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
150a0 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
150b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
150c0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
150d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
150e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
150f0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15110 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
15120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15130 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
15140 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
15150 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
15160 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15170 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
15180 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15190 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
151a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
151b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
151c0 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151e0 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
151f0 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
15200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15210 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15220 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
15230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15240 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
15250 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
15260 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15280 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15290 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
152a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
152b0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
152c0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
152d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
152f0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
15300 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
15310 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
15320 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
15330 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
15340 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
15350 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
15360 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
15370 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
15380 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
15390 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
153a0 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
153b0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
153c0 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
153d0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
153e0 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
153f0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
15400 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
15410 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
15420 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
15430 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
15440 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15450 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
15460 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
15470 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
15480 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
15490 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
154a0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
154b0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
154c0 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
154d0 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
154e0 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
154f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
15500 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
15510 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
15520 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15540 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15550 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
15560 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
15570 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
15580 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
15590 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
155a0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155c0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
155d0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
155e0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
155f0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
15600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15610 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
15620 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
15630 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
15640 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
15650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15660 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
15670 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
15680 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
15690 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
156a0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
156b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
156c0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
156d0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
156e0 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
156f0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
15700 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15710 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15720 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
15730 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
15740 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
15750 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
15760 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
15770 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
15780 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
15790 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
157a0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
157b0 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
157c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
157d0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
157e0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
157f0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
15800 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
15810 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
15820 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
15830 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
15840 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
15850 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15860 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
15870 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
15880 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
15890 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
158a0 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
158b0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
158c0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
158d0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
158e0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
158f0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
15900 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
15910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15920 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15930 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
15940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15960 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15970 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
15980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15990 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
159a0 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
159b0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
159c0 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
159f0 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
15a00 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15a10 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
15a20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15a30 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
15a40 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
15a50 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
15a60 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
15a70 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
15a80 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
15a90 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
15aa0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
15ab0 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
15ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
15ad0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15ae0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15af0 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72  ECT */../*.** Er
15b00 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
15b10 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  when two or more
15b20 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70   terms of a comp
15b30 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65  ound select have
15b40 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69   different.** si
15b50 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ze result sets..
15b60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
15b70 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
15b80 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  msError(Parse *p
15b90 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
15ba0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  ){.  if( p->selF
15bb0 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
15bc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15bd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15be0 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
15bf0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
15c00 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
15c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15c20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15c30 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
15c40 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
15c50 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
15c60 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
15c70 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
15c80 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
15c90 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
15ca0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d  e(p->op));.  }.}
15cb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
15cc0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
15cd0 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
15ce0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
15cf0 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
15d00 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
15d10 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
15d20 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
15d30 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
15d40 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
15d50 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
15d60 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
15d70 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
15d80 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
15d90 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
15da0 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
15db0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15dc0 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
15dd0 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
15de0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
15df0 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
15e00 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
15e10 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
15e20 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
15e30 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
15e40 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
15e50 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
15e60 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
15e70 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
15e80 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
15e90 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
15ea0 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
15eb0 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
15ec0 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
15ed0 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
15ee0 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
15ef0 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
15f00 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
15f10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
15f20 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
15f30 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
15f40 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
15f50 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
15f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f70 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
15f80 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
15f90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15fa0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15fb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15fc0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15fd0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
15fe0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
15ff0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
16000 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
16010 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
16020 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
16030 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
16040 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
16050 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
16060 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
16070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16080 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
16090 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
160a0 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
160b0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
160c0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
160d0 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
160e0 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
160f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
16100 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
16110 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
16120 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
16130 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
16140 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
16150 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
16160 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
16170 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
16180 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
16190 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
161a0 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
161b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
161c0 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
161d0 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
161e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
161f0 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
16200 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
16210 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
16220 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
16230 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
16240 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
16250 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72   addr2;.    addr
16260 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
16270 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
16280 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
16290 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
162a0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
162b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
162c0 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
162d0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
162e0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16310 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
16320 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
16330 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
16340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16350 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
16360 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  ddr2+2, iContinu
16370 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62  e, addr2+2); Vdb
16380 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16390 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
163a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
163b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
163c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
163d0 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  y, pIn->iSdst, r
163e0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
163f0 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Sdst-1);.    sql
16400 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16410 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
16420 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
16430 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
16440 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
16450 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
16460 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72  Suppress the fir
16470 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
16480 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
16490 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
164a0 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
164b0 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
164c0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61  iContinue);..  a
164d0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
164e0 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
164f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  );.  assert( pDe
16500 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54  st->eDest!=SRT_T
16510 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68  able );.  switch
16520 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
16530 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
16540 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
16550 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
16560 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
16570 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
16580 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
16590 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
165a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
165b0 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
165c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
165d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
165e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
165f0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
16600 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
16610 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
16620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16640 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
16650 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
16660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16670 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
16680 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
16690 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
166a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
166b0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
166c0 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
166d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
166e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
166f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16700 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16710 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
16720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16740 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
16750 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
16760 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
16770 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
16780 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
16790 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
167a0 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
167b0 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
167c0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
167d0 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
167e0 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
167f0 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
16800 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
16810 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
16820 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
16830 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
16840 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
16850 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
16860 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d   );.      pDest-
16870 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20  >affSdst = .    
16880 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70       sqlite3Comp
16890 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70  areAffinity(p->p
168a0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
168b0 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
168c0 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
168d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
168e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
168f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16900 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
16910 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
16920 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  1, r1, &pDest->a
16930 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20  ffSdst,1);.     
16940 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16950 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16960 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
16970 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  st, 1);.      sq
16980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16990 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
169a0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
169b0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
169c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
169d0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
169e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
169f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
16a00 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
16a10 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
16a20 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
16a30 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
16a40 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
16a50 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
16a60 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
16a70 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
16a80 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
16a90 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
16aa0 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
16ab0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16ac0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c   pIn->nSdst==1 |
16ad0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
16ae0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70   );  testcase( p
16af0 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a  In->nSdst!=1 );.
16b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16b10 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
16b20 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
16b30 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29  est->iSDParm, 1)
16b40 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
16b50 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
16b60 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
16b70 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
16b80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16b90 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
16ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16bb0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
16bc0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
16bd0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
16be0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
16bf0 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
16c00 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d  arting at pDest-
16c10 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68  >iSdst.  Then th
16c20 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
16c30 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
16c40 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
16c50 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
16c60 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  ){.        pDest
16c80 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65  ->iSdst = sqlite
16c90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
16ca0 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  arse, pIn->nSdst
16cb0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74  );.        pDest
16cc0 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e  ->nSdst = pIn->n
16cd0 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sdst;.      }.  
16ce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16cf0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16d00 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
16d10 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  t->iSdst, pIn->n
16d20 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
16d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16d40 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
16d50 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
16d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16d70 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
16d80 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
16d90 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
16da0 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
16db0 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
16dc0 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
16dd0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
16de0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
16df0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
16e00 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
16e10 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
16e20 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
16e30 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
16e40 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
16e50 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
16e60 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16e70 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16e80 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
16e90 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
16ea0 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
16eb0 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
16ec0 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
16ed0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
16ee0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
16ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
16f00 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
16f10 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
16f20 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
16f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16f50 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
16f60 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16f70 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16f80 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16f90 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16fa0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16fb0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16fc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16fd0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
16fe0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
16ff0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
17000 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
17010 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
17020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
17030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17040 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
17050 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
17060 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17070 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
17080 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
17090 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
170a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
170b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
170c0 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
170d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
170e0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
170f0 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
17100 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
17110 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
17120 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
17130 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
17140 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
17150 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
17160 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
17170 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
17180 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
17190 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
171a0 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
171b0 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
171c0 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
171d0 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
171e0 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
171f0 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
17200 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
17210 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
17220 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
17230 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
17240 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
17250 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
17260 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
17270 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
17280 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
17290 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
172a0 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
172b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
172c0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
172d0 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
172e0 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
172f0 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
17300 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
17310 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
17320 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
17330 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
17340 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17350 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
17360 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
17370 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
17380 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
17390 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
173a0 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
173b0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
173c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
173d0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
173e0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
173f0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
17400 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
17410 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
17420 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
17430 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
17440 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
17450 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
17460 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
17470 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
17480 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
17490 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
174a0 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
174b0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
174c0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
174d0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
174e0 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
174f0 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
17500 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
17510 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
17520 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
17530 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
17540 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17550 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
17560 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
17570 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
17580 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
17590 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
175a0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
175b0 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
175c0 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
175d0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
175e0 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
175f0 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
17600 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
17610 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
17620 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
17630 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
17640 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
17650 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
17660 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
17670 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
17680 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
17690 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
176a0 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
176b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
176c0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
176d0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
176e0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
176f0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
17700 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
17710 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
17720 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
17730 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
17740 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
17750 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17760 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
17770 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
17780 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
17790 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
177a0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
177b0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
177c0 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
177d0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
177e0 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
177f0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17800 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17810 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
17820 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
17830 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
17840 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
17850 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
17860 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
17870 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
17880 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
17890 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
178a0 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
178b0 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
178c0 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
178d0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
178e0 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
178f0 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
17900 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
17910 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
17920 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
17930 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
17940 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
17950 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
17960 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
17970 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
17980 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
17990 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
179a0 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
179b0 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
179c0 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
179d0 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
179e0 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
179f0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
17a00 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
17a10 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
17a20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
17a30 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
17a40 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
17a50 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
17a60 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
17a70 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
17a80 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
17a90 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
17aa0 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
17ab0 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
17ac0 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
17ad0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17ae0 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
17af0 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
17b00 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
17b10 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
17b20 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
17b30 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
17b40 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
17b50 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
17b60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
17b70 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
17b80 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
17b90 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
17ba0 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
17bb0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
17bc0 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
17bd0 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
17be0 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
17bf0 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
17c00 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
17c10 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
17c20 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
17c30 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
17c40 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
17c50 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
17c60 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
17c70 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
17c80 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
17c90 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
17ca0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
17cb0 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
17cc0 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
17cd0 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
17ce0 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
17cf0 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
17d00 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
17d10 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
17d20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
17d30 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
17d40 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
17d50 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
17d60 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
17d70 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
17d80 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
17d90 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
17da0 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
17db0 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
17dc0 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
17dd0 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
17de0 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
17df0 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
17e00 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
17e10 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
17e20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
17e30 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
17e40 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
17e50 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
17e60 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
17e70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
17e80 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
17e90 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
17ea0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
17eb0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
17ec0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17ed0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
17ee0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
17ef0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17f00 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
17f10 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
17f20 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
17f30 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
17f40 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
17f50 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
17f60 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
17f70 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
17f80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17f90 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
17fa0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
17fb0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
17fc0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
17fd0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
17fe0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
17ff0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
18000 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
18010 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
18020 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
18030 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
18040 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
18050 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
18060 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
18070 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
18080 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
18090 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
180a0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
180b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
180c0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
180d0 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
180e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
180f0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
18100 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
18110 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
18120 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
18130 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
18140 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
18150 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
18160 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
18170 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
18180 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
18190 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
181a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
181b0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
181c0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
181d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
181e0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
181f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18200 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18210 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18220 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18230 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
18240 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18250 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
18260 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18270 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
18280 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18290 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
182a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
182b0 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
182c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
182d0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
182e0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
182f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18300 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
18310 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
18320 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
18330 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
18340 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
18350 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18360 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
18370 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
18380 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18390 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
183a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
183b0 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
183c0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
183d0 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
183e0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
183f0 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
18400 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
18410 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18420 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
18430 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18440 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
18450 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
18460 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18470 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
18480 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
18490 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
184a0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
184b0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
184c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
184d0 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
184e0 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
184f0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
18500 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
18510 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
18520 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
18530 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
18540 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
18550 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
18560 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
18570 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
18580 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
18590 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
185a0 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
185b0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
185c0 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
185d0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
185e0 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
185f0 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
18600 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
18610 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
18620 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
18630 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
18640 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
18650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18660 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
18670 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
18680 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
18690 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
186a0 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
186b0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
186c0 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
186d0 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
186e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
186f0 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
18700 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18710 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
18720 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18730 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
18740 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18750 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
18760 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
18770 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
18780 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
18790 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
187a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
187b0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
187c0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
187d0 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
187e0 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
187f0 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
18800 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
18810 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66  t columns */.#if
18820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18830 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
18840 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
18850 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
18860 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
18870 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
18890 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
188a0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
188b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
188c0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
188d0 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
188e0 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
188f0 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
18900 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
18910 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
18920 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
18930 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18940 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
18950 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
18960 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
18970 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
18980 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
18990 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
189a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
189b0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
189c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
189d0 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
189e0 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
189f0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
18a00 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
18a10 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
18a20 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
18a30 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18a40 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
18a50 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
18a60 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
18a70 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
18a80 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
18a90 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
18aa0 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
18ab0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
18ac0 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
18ad0 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
18ae0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18af0 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
18b00 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
18b10 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
18b20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
18b30 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
18b40 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
18b50 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
18b60 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
18b70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18b80 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
18b90 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18ba0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
18bb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18bc0 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
18bd0 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
18be0 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
18bf0 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
18c00 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18c10 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
18c20 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
18c30 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
18c40 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18c50 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
18c60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18c70 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
18c80 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
18c90 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
18ca0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
18cb0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
18cc0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
18cd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18ce0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
18cf0 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
18d00 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
18d10 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
18d20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
18d30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
18d40 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
18d50 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
18d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
18d70 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
18d80 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
18d90 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
18da0 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
18db0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18dc0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
18dd0 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
18de0 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
18df0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
18e00 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
18e10 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
18e20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
18e30 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
18e40 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
18e50 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
18e60 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
18e70 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
18e80 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
18e90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18ea0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
18eb0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
18ec0 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
18ed0 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
18ee0 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
18ef0 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
18f00 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
18f10 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
18f20 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
18f30 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
18f40 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
18f50 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
18f60 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
18f70 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
18f80 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
18f90 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
18fa0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
18fb0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
18fc0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
18fd0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18fe0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
18ff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
19000 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
19010 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
19020 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
19030 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
19040 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
19050 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
19060 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
19070 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
19080 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
19090 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
190a0 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
190b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
190c0 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
190d0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
190e0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
190f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
19100 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
19110 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
19120 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
19130 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
19140 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
19150 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
19160 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
19170 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
19180 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
19190 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
191a0 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
191b0 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
191c0 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
191d0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
191e0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
191f0 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
19200 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
19210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19220 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
19230 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
19240 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
19250 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
19260 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
19270 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
19280 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
19290 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
192a0 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
192b0 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
192c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
192d0 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
192e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
192f0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
19300 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
19310 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
19320 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
19330 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
19340 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
19350 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
19360 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
19370 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
19380 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19390 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
193a0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
193b0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
193c0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
193d0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
193e0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
193f0 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
19400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19410 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
19420 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
19430 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
19440 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
19450 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
19460 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
19470 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
19480 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
19490 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
194a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
194b0 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
194c0 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
194d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
194e0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
194f0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
19500 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
19510 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
19520 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
19530 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
19540 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
19550 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
19560 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
19570 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
19580 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
19590 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
195a0 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
195b0 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
195c0 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
195d0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
195e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
195f0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
19600 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
19610 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
19650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19660 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
19670 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
19680 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
19690 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
196a0 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
196b0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
196c0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
196d0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
196e0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
196f0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19700 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
19710 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
19720 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
19730 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
19740 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
19750 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
19760 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
19770 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
19780 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19790 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
197a0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
197b0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
197c0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
197d0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
197e0 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
197f0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
19800 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
19810 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
19820 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
19830 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19840 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
19850 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
19860 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
19870 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
19880 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
19890 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
198a0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
198b0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
198c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
198d0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
198e0 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
198f0 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
19900 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19910 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
19920 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
19930 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
19940 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
19950 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
19960 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
19970 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19980 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
19990 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
199a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
199b0 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
199c0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
199d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
199e0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
199f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
19a00 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
19a10 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
19a20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
19a30 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
19a40 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
19a50 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
19a60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19a70 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
19a80 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
19a90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19aa0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
19ab0 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
19ac0 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
19ad0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19ae0 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
19af0 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
19b00 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
19b10 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
19b20 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
19b30 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
19b40 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
19b50 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
19b60 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
19b70 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
19b80 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
19b90 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
19ba0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
19bb0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
19bc0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
19bd0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
19be0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19bf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
19c00 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
19c10 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
19c20 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19c30 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
19c40 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
19c50 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
19c60 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
19c70 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
19c80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19c90 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
19ca0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19cb0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19cc0 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
19cd0 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
19ce0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
19cf0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
19d00 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
19d10 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
19d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d30 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19d40 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19d50 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
19d60 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19d70 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
19d80 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
19d90 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
19da0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19db0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19dc0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
19dd0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19de0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
19df0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
19e00 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19e10 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
19e20 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
19e30 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
19e40 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
19e50 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
19e60 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
19e70 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
19e80 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
19e90 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
19ea0 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
19eb0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19ec0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
19ed0 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
19ee0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19ef0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
19f00 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
19f10 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
19f20 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
19f30 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
19f40 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
19f50 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19f60 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
19f70 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
19f80 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
19f90 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
19fa0 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
19fb0 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
19fc0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
19fd0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
19fe0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
19ff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a000 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1a010 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1a020 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
1a030 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
1a040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a050 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
1a060 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
1a090 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a0a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1a0b0 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b  to(v, addrEofA);
1a0c0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
1a0d0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
1a0e0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
1a0f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a100 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1a110 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1a120 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
1a130 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1a140 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1a150 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
1a160 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1a170 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a180 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1a190 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
1a1a0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
1a1b0 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
1a1c0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
1a1d0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
1a1e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1a1f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1a200 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a210 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
1a220 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1a230 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
1a240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a250 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1a260 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
1a270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a280 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a290 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
1a2a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a2b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a2c0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1a2d0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
1a2e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a2f0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a300 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
1a310 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a320 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
1a330 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1a340 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
1a350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a360 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1a370 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
1a380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a390 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a3a0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1a3b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a3c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a3d0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a3e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a3f0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a400 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
1a410 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1a420 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
1a430 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1a440 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
1a450 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a460 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1a470 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
1a480 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
1a490 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
1a4a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
1a4b0 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
1a4c0 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
1a4d0 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
1a4e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a4f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1a500 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1a510 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1a520 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a530 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1a540 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1a550 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1a560 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
1a570 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1a580 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
1a590 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1a5a0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
1a5b0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1a5c0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
1a5d0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1a5e0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1a5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a600 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1a610 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1a620 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
1a630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a640 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a650 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1a660 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a670 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1a680 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1a690 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
1a6a0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
1a6b0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
1a6c0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
1a6d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1a6e0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c  v, addr1);.  sql
1a6f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a700 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1a710 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e  ddrA, addrEofA_n
1a720 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  oB); VdbeCoverag
1a730 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a740 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a750 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a760 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1a770 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1a780 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
1a790 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
1a7a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a7b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a7c0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1a7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a7e0 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
1a7f0 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
1a800 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
1a810 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
1a820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a830 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
1a840 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
1a850 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
1a860 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1a880 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
1a890 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
1a8a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1a8b0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
1a8c0 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
1a8d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a8e0 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
1a8f0 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
1a900 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  gtB); VdbeCovera
1a910 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ge(v);..  /* Jum
1a920 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
1a930 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
1a940 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
1a950 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
1a960 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a970 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
1a980 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1a990 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
1a9a0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1a9b0 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1a9c0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
1a9d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
1a9e0 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
1a9f0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
1aa00 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
1aa10 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
1aa20 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
1aa30 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1aa40 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
1aa50 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
1aa60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
1aa70 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1aa80 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1aa90 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1aaa0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1aab0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1aac0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1aad0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1aae0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1aaf0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1ab00 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1ab10 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1ab20 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1ab30 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1ab40 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1ab50 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1ab60 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1ab70 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1ab80 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1ab90 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1aba0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1abb0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1abc0 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1abd0 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b  pParse->nErr!=0;
1abe0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1abf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ac00 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1ac10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ac20 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1ac30 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1ac40 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1ac50 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1ac60 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1ac70 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1ac80 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1ac90 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1aca0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1acb0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1acc0 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1acd0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1ace0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1acf0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1ad00 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1ad10 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1ad20 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1ad30 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1ad40 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1ad50 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1ad60 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1ad70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1ad80 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1ad90 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1ada0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1adb0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1adc0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1add0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1ade0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1adf0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1ae00 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1ae10 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1ae20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1ae30 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1ae40 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1ae50 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1ae60 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1ae70 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1ae80 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1ae90 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
1aea0 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1aeb0 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1aec0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1aed0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1aee0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1aef0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1af00 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1af10 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1af20 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1af30 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1af40 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1af50 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1af60 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1af70 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1af80 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1af90 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1afa0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1afb0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1afc0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1afd0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1afe0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1aff0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1b000 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1b010 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1b020 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1b030 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1b040 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b050 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1b060 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1b070 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1b080 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1b090 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1b0a0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1b0b0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1b0c0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1b0d0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1b0e0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1b0f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1b100 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1b110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b120 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1b130 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1b140 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1b150 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b160 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1b170 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1b180 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1b190 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b1a0 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1b1b0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1b1c0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1b1d0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1b1e0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1b1f0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1b200 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b210 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1b220 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1b230 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1b240 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b250 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1b260 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b270 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b280 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1b290 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1b2a0 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1b2b0 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a  le, pEList, 1);.
1b2c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b2d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b2e0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
1b2f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b300 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b310 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1b320 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b330 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
1b340 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b350 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1b360 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1b370 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1b380 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
1b390 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1b3a0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1b3b0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
1b3c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b3d0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b3e0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
1b3f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1b400 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1b410 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1b420 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1b430 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1b440 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1b450 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1b460 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
1b470 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1b480 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
1b490 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1b4a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b4b0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1b4c0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1b4d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1b4e0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1b4f0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
1b500 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
1b510 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1b520 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b530 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1b540 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1b550 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1b560 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1b570 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
1b580 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1b590 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20   *pEList,    /* 
1b5a0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1b5b0 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1b5c0 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  or          /* D
1b5d0 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1b5e0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1b5f0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1b600 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1b610 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1b620 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1b630 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1b640 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1b650 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1b660 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
1b670 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
1b680 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1b690 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1b6a0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b6b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b6c0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1b6d0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b6e0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1b6f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b700 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1b710 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b720 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1b730 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1b740 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1b750 69 73 74 29 3b 0a 20 20 20 20 70 53 72 63 20 3d  ist);.    pSrc =
1b760 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73   p->pSrc;.    as
1b770 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1b780 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1b790 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1b7a0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1b7b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1b7c0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1b7d0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1b7e0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20  iTable, pEList, 
1b7f0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1b800 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1b810 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1b820 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b830 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1b840 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1b850 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1b860 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1b870 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1b880 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1b890 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1b8a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1b8b0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1b8c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b8d0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1b8e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b8f0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b900 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b910 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1b920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1b930 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1b940 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1b950 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1b960 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1b970 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1b980 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1b990 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1b9a0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1b9b0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1b9c0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1b9d0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1b9e0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1b9f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1ba00 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1ba10 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1ba20 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1ba30 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1ba40 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1ba50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1ba60 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1ba70 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1ba80 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1ba90 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1baa0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1bab0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1bac0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bad0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1bae0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1baf0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1bb00 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1bb10 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1bb20 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1bb30 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1bb40 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1bb50 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1bb60 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1bb70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1bb80 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1bb90 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1bba0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1bbb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1bbc0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1bbd0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1bbe0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1bbf0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1bc00 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1bc10 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1bc20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1bc30 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1bc40 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1bc50 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1bc60 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1bc70 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1bc80 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1bc90 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1bca0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1bcb0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1bcc0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1bcd0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1bce0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1bcf0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1bd00 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1bd10 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1bd20 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1bd30 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1bd40 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1bd50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1bd60 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1bd70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bd80 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1bd90 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1bda0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1bdb0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1bdc0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1bdd0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1bde0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1bdf0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1be00 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1be10 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1be20 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1be30 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1be40 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1be50 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1be60 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1be70 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1be80 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1be90 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1bea0 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1beb0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1bec0 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1bed0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1bee0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1bef0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1bf00 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1bf10 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1bf20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1bf30 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1bf40 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1bf50 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1bf60 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1bf70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bf80 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1bf90 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1bfa0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1bfb0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1bfc0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1bfd0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1bfe0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1bff0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1c000 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1c010 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1c020 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1c030 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1c040 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1c050 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1c060 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1c070 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1c080 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1c090 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1c0a0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1c0b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c0c0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1c0d0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1c0e0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1c0f0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1c100 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1c110 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1c120 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1c130 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1c140 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1c150 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1c160 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1c170 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1c180 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1c190 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1c1a0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1c1b0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1c1c0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1c1d0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1c1e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c1f0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c200 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c210 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1c220 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1c230 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c240 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c250 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c260 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1c270 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1c280 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1c290 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1c2a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1c2b0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1c2c0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1c2d0 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1c2e0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1c2f0 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1c300 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1c310 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1c320 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1c330 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c340 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1c350 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1c360 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1c370 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1c380 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1c390 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1c3a0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c3b0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1c3c0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1c3d0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1c3e0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1c3f0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1c400 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1c410 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1c420 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1c430 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1c440 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1c450 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1c460 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1c470 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1c480 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1c490 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1c4a0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1c4b0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1c4c0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1c4d0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1c4e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1c4f0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1c500 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1c510 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1c520 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1c530 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1c540 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1c550 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1c560 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1c570 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1c580 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1c590 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1c5a0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1c5b0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1c5c0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1c5d0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1c5e0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1c5f0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1c600 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1c610 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1c620 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1c630 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1c640 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1c650 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1c660 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1c670 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1c680 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1c690 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1c6a0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1c6b0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1c6c0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1c6d0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1c6e0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1c6f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1c700 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1c710 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1c720 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1c730 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1c740 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1c750 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1c760 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1c770 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1c780 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1c790 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1c7a0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1c7b0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1c7c0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1c7d0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1c7e0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1c7f0 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1c800 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1c810 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1c820 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1c830 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1c840 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1c850 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1c860 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1c870 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1c880 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1c890 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1c8a0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1c8b0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1c8c0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1c8d0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1c8e0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1c8f0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1c900 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1c910 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1c920 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1c930 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1c940 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1c950 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1c960 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1c970 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1c980 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1c990 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1c9a0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1c9b0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1c9c0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1c9d0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1c9e0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1c9f0 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1ca00 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1ca10 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1ca20 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1ca30 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1ca40 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1ca50 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1ca60 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1ca70 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1ca80 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1ca90 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1caa0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1cab0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1cac0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1cad0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1cae0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1caf0 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1cb00 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1cb10 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1cb20 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1cb30 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1cb40 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1cb50 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cb60 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1cb70 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1cb80 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1cb90 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1cba0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1cbb0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1cbc0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1cbd0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1cbe0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1cbf0 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1cc00 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1cc10 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1cc20 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1cc30 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1cc40 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1cc50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1cc60 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1cc70 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1cc80 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1cc90 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1cca0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1ccb0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1ccc0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1ccd0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1cce0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1ccf0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1cd00 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1cd10 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1cd20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1cd30 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1cd40 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1cd50 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1cd60 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1cd70 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1cd80 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1cd90 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1cda0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1cdb0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1cdc0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1cdd0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1cde0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1cdf0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1ce00 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1ce10 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1ce20 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1ce30 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1ce40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1ce50 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1ce60 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1ce70 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1ce80 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1ce90 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1cea0 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1ceb0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1cec0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1ced0 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1cee0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1cef0 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1cf00 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1cf10 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1cf20 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1cf30 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1cf40 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1cf50 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1cf60 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1cf70 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1cf80 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1cf90 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1cfa0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1cfb0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1cfc0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1cfd0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1cfe0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1cff0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1d000 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1d010 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1d020 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1d030 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d040 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1d050 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1d060 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1d070 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1d080 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d090 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d0a0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1d0b0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1d0c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d0d0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1d0e0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1d0f0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1d100 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1d110 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1d120 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1d130 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1d140 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1d150 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1d160 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1d170 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1d180 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1d190 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1d1a0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1d1b0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1d1c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1d1d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1d1e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1d1f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1d200 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1d210 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1d220 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1d230 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d240 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1d250 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1d260 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1d270 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1d280 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1d290 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1d2a0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d2b0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1d2c0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1d2d0 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1d2e0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1d2f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1d300 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1d310 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1d320 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1d330 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1d340 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1d350 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1d360 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1d370 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1d380 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d390 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1d3a0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1d3b0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1d3c0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1d3d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d3e0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1d3f0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1d400 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1d410 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1d420 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d430 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d440 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d450 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1d460 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d470 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1d480 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1d490 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1d4a0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1d4b0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1d4c0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1d4d0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1d4e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1d4f0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1d500 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1d510 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1d520 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1d530 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1d540 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1d550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d560 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1d570 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1d580 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1d590 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1d5a0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1d5b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1d5c0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1d5d0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1d5e0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1d5f0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1d600 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1d610 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1d620 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1d630 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1d640 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1d650 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1d660 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1d670 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1d680 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1d690 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1d6a0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1d6b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1d6c0 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1d6d0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1d6e0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1d6f0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1d700 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1d710 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1d720 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1d730 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1d740 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1d750 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   );.  if( subque
1d760 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ryIsAgg ){.    i
1d770 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72  f( isAgg ) retur
1d780 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d7b0 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20  on (1)   */.    
1d7c0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31  if( pSrc->nSrc>1
1d7d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d800 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20  ion (2a)  */.   
1d810 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20   if( (p->pWhere 
1d820 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1d830 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f  ty(p->pWhere,EP_
1d840 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20  Subquery)).     
1d850 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1d860 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69  istFlags(p->pELi
1d870 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  st) & EP_Subquer
1d880 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73  y)!=0.     || (s
1d890 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1d8a0 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ags(p->pOrderBy)
1d8b0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1d8c0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1d8d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d910 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d  n (2b)  */.    }
1d920 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62  .  }.    .  pSub
1d930 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1d940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d950 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1d960 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1d970 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1d980 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1d990 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1d9a0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1d9b0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1d9c0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1d9d0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1d9e0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1d9f0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1da00 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1da10 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1da20 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1da30 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1da40 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1da50 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1da60 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1da70 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1da80 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1da90 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1daa0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1dab0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1dac0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1dae0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1daf0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1db00 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1db30 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1db40 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1db50 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1db60 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1db70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1db80 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1dbc0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1dbd0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1dbe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dc10 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1dc20 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1dc30 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1dc40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1dc50 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dc60 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1dc70 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1dc80 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1dc90 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1dca0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1dcb0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dcc0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1dcd0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1dce0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1dcf0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1dd00 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1dd10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dd20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dd30 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1dd40 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1dd50 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1dd60 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1dd70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dda0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1ddb0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1ddc0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1ddd0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1dde0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ddf0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1de00 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1de10 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1de20 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1de30 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1de40 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1de50 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1de60 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1de70 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1de80 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1de90 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1dea0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1deb0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1dec0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1ded0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1dee0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1def0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1df00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1df10 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1df20 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1df30 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1df40 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1df50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1df60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1df70 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1df80 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1df90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1dfa0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1dfb0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1dfc0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1dfd0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1dfe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1dff0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1e000 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1e010 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1e020 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1e030 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1e040 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1e050 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1e060 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1e070 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1e080 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1e090 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1e0a0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1e0b0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1e0c0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1e0d0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1e0e0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1e0f0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1e100 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1e110 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1e120 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1e130 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1e140 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1e150 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1e160 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1e170 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1e180 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1e190 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1e1a0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1e1b0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1e1c0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1e1d0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1e1e0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1e1f0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1e200 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1e210 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1e220 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1e230 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1e240 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1e250 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1e260 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1e270 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1e280 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1e290 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1e2a0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1e2b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e2c0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1e2d0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1e2e0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1e2f0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1e300 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1e310 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1e320 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1e330 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1e340 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1e350 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1e360 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1e370 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1e380 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1e390 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1e3a0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1e3b0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1e3c0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1e3d0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e3e0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1e3f0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1e400 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1e410 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1e420 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1e430 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1e440 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1e450 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1e460 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1e470 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1e480 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1e490 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1e4a0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1e4b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1e4c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1e4d0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1e4e0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e4f0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1e500 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1e510 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1e520 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1e530 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1e540 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1e550 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1e560 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1e570 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1e580 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1e590 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1e5a0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1e5b0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e5c0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1e5d0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1e5e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e5f0 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1e600 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1e610 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1e620 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e630 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1e640 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1e650 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e660 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1e670 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1e680 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1e690 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1e6a0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1e6b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e6c0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e6d0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1e6e0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1e6f0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1e700 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1e710 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1e720 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1e730 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1e740 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1e750 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
1e760 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
1e770 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
1e780 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1e790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1e7a0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1e7b0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e7c0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1e7d0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1e7e0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1e7f0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1e800 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1e810 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1e820 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1e830 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1e840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e850 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1e860 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1e870 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e880 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1e890 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1e8a0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1e8b0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1e8c0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1e8d0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1e8e0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1e8f0 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1e900 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1e910 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1e920 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1e930 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1e940 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1e950 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1e960 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
1e970 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
1e980 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
1e990 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
1e9a0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1e9b0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
1e9c0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
1e9d0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
1e9e0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1e9f0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1ea00 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1ea10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1ea20 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1ea30 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1ea40 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1ea50 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1ea60 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1ea70 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1ea80 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1ea90 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1eaa0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1eab0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1eac0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1ead0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1eae0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1eaf0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1eb00 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1eb10 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1eb20 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1eb30 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1eb40 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1eb50 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1eb60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1eb70 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1eb80 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1eb90 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1eba0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1ebb0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1ebc0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1ebd0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1ebe0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1ebf0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1ec00 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1ec10 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1ec20 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1ec30 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1ec40 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1ec50 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1ec60 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1ec70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1ec80 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1ec90 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1eca0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1ecb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1ecc0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1ecd0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1ece0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1ecf0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1ed00 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1ed10 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1ed20 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1ed30 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1ed40 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1ed50 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1ed60 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1ed70 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1ed80 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1ed90 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1eda0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1edb0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1edc0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1edd0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1ede0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1edf0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1ee00 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1ee10 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1ee20 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1ee30 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ee40 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1ee50 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1ee60 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1ee70 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1ee80 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1ee90 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1eea0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1eeb0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1eec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1eed0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1eee0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1eef0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1ef00 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1ef10 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1ef20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1ef30 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1ef40 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1ef50 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1ef60 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1ef70 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1ef80 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1ef90 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1efa0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1efb0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1efc0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1efd0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1efe0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1eff0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1f000 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1f010 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1f020 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1f030 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1f040 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1f050 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1f060 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
1f070 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
1f080 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1f090 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1f0a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1f0b0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1f0c0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1f0d0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1f0e0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1f0f0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1f100 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1f110 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1f120 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1f130 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1f140 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1f150 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1f160 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1f170 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1f180 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1f190 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1f1a0 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
1f1b0 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
1f1c0 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
1f1d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f1e0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
1f1f0 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
1f200 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
1f210 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
1f220 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1f230 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f240 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1f250 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
1f260 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
1f270 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1f280 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f290 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
1f2a0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
1f2b0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
1f2c0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f2d0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
1f2e0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
1f2f0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
1f300 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f310 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
1f320 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
1f330 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f340 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1f350 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f360 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
1f370 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1f380 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1f390 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
1f3a0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1f3b0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1f3c0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
1f3d0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1f3e0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f3f0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
1f400 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
1f410 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
1f420 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1f430 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1f440 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
1f450 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
1f460 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
1f470 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
1f480 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
1f490 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
1f4a0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
1f4b0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
1f4c0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
1f4d0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
1f4e0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
1f4f0 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
1f500 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
1f510 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
1f520 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
1f530 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
1f540 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
1f550 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
1f560 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
1f570 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
1f580 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
1f590 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
1f5a0 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
1f5b0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1f5c0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1f5d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
1f5e0 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
1f5f0 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
1f600 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
1f610 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1f620 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
1f630 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
1f640 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
1f650 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
1f660 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
1f670 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1f680 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1f690 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
1f6a0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
1f6b0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1f6c0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
1f6d0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
1f6e0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
1f6f0 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
1f700 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
1f710 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
1f720 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
1f730 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
1f740 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1f750 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
1f760 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
1f770 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
1f780 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1f790 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
1f7a0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
1f7b0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
1f7c0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
1f7d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f7e0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1f7f0 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
1f800 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
1f810 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
1f820 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1f830 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
1f840 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
1f850 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
1f860 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1f870 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1f880 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1f890 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
1f8a0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
1f8b0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
1f8c0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
1f8d0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
1f8e0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
1f8f0 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1f900 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1f910 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1f920 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
1f930 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1f940 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1f950 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
1f960 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
1f970 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
1f980 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
1f990 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1f9a0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
1f9b0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
1f9c0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1f9d0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
1f9e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1f9f0 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
1fa00 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1fa10 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
1fa20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1fa30 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
1fa40 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
1fa50 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1fa60 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1fa70 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1fa80 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
1fa90 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
1faa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1fab0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
1fac0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
1fad0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1fae0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1faf0 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1fb00 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
1fb10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fb20 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
1fb30 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
1fb40 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
1fb50 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1fb60 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1fb70 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
1fb80 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1fb90 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
1fba0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
1fbb0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1fbc0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1fbd0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
1fbe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fbf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1fc00 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
1fc10 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
1fc20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1fc30 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
1fc40 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
1fc50 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
1fc60 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
1fc70 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
1fc80 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
1fc90 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
1fca0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
1fcb0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
1fcc0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
1fcd0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
1fce0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1fcf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1fd00 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1fd10 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1fd20 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
1fd30 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
1fd40 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
1fd50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
1fd60 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
1fd70 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
1fd80 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
1fd90 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
1fda0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
1fdb0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
1fdc0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
1fdd0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
1fde0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
1fdf0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
1fe00 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1fe10 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1fe20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
1fe30 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
1fe40 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
1fe50 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
1fe60 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
1fe70 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
1fe80 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
1fe90 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1fea0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1feb0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1fec0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
1fed0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
1fee0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
1fef0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1ff00 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
1ff10 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
1ff20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1ff30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ff40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ff50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ff60 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
1ff70 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1ff80 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
1ff90 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
1ffa0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
1ffb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1ffc0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
1ffd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1ffe0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1fff0 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
20000 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
20010 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
20020 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
20030 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
20040 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
20050 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
20060 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
20070 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
20080 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
20090 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
200a0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
200b0 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e  a[iFrom].fg.join
200c0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
200d0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
200e0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
200f0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
20100 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
20110 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
20120 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20130 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
20140 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
20150 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
20160 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
20170 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
20180 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
20190 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
201a0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
201b0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
201c0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
201d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
201e0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
201f0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
20200 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
20210 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
20220 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
20230 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
20240 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20250 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
20260 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
20270 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
20280 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20290 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
202a0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
202b0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
202c0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
202d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
202e0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
202f0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
20300 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
20310 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
20320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
20330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
20340 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
20350 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
20360 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
20370 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
20380 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
20390 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
203a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
203b0 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
203c0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
203d0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
203e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
203f0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
20400 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
20410 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
20420 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
20430 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
20440 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
20450 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
20460 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
20470 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
20480 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
20490 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
204a0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
204b0 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
204c0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
204d0 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
204e0 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
204f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20500 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
20510 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
20520 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
20530 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
20540 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
20550 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
20560 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
20570 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20580 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
20590 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
205a0 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
205b0 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
205c0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
205d0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
205e0 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
205f0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
20600 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
20610 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
20620 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
20630 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
20640 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
20650 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
20660 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
20670 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
20680 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
20690 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
206a0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
206b0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
206c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
206d0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
206e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
206f0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
20700 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
20710 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
20720 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20730 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
20740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20750 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
20760 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20770 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
20780 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
20790 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
207a0 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
207b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
207c0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
207d0 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
207e0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
207f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20800 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
20810 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
20820 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
20830 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20840 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20850 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20860 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20870 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
20880 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
20890 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
208d0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
208e0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
208f0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20900 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
20910 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
20920 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
20930 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
20940 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
20950 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20960 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20970 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
20980 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20990 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
209a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62  );.    }.    sub
209b0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 50 61  stSelect(db, pPa
209c0 72 65 6e 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  rent, iParent, p
209d0 53 75 62 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  Sub->pEList, 0);
209e0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
209f0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
20a00 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
20a10 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
20a20 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
20a30 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
20a40 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
20a50 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
20a60 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
20a70 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
20a80 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
20a90 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
20aa0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
20ab0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
20ac0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
20ad0 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
20ae0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
20af0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
20b00 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
20b10 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
20b20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
20b30 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
20b40 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
20b50 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
20b60 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
20b70 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
20b80 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
20b90 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
20ba0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
20bb0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
20bc0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
20bd0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
20be0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
20bf0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
20c00 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
20c10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
20c20 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
20c30 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
20c40 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
20c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
20c60 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
20c70 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
20c80 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
20c90 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
20ca0 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
20cb0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
20cc0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
20cd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
20ce0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
20cf0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
20d00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20d10 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
20d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
20d30 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
20d40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20d50 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
20d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20d70 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
20d80 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
20d90 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
20da0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
20db0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
20dc0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
20dd0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
20de0 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
20df0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
20e00 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
20e10 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
20e20 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
20e30 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
20e40 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
20e50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
20e60 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
20e70 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
20e80 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
20e90 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
20ea0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
20eb0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
20ec0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
20ed0 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
20ee0 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
20ef0 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
20f00 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
20f10 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
20f20 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
20f30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
20f40 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20  **.**   (1) The 
20f50 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61  inner query is a
20f60 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49  n aggregate.  (I
20f70 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27  n that case, we'
20f80 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  d really want.**
20f90 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74         to copy t
20fa0 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63  he outer WHERE-c
20fb0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f  lause terms onto
20fc0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
20fd0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  se of the.**    
20fe0 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20     inner query. 
20ff0 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62   But they probab
21000 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68  ly won't help th
21010 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ere so do not bo
21020 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  ther.).**.**   (
21030 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
21040 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
21050 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
21060 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
21070 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
21080 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
21090 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
210a0 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
210b0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
210c0 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
210d0 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
210e0 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
210f0 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
21100 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
21110 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
21120 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21130 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
21140 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
21150 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
21160 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
21170 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
21180 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
21190 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
211a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
211b0 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
211c0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
211d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
211e0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
211f0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
21200 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
21210 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
21220 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
21230 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
21240 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
21250 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
21260 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
21270 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
21280 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
21290 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
212a0 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
212b0 54 65 72 6d 73 28 0a 20 20 73 71 6c 69 74 65 33  Terms(.  sqlite3
212c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f   *db,          /
212d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
212e0 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d  onnection (for m
212f0 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65  alloc()) */.  Se
21300 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20  lect *pSubq,    
21310 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
21320 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20  ery whose WHERE 
21330 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20  clause is to be 
21340 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45  augmented */.  E
21350 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
21360 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
21370 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
21380 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
21390 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20 20   int iCursor    
213a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
213b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73   number of the s
213c0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
213d0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
213e0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
213f0 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
21400 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
21410 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20  pSubq->selFlags 
21420 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65 7c  & (SF_Aggregate|
21430 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21 3d  SF_Recursive))!=
21440 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
21450 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
21460 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29 20  ons (1) and (2) 
21470 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
21480 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b  bq->pLimit!=0 ){
21490 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
214a0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
214b0 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  3) */.  }.  whil
214c0 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
214d0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68  K_AND ){.    nCh
214e0 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68  ng += pushDownWh
214f0 65 72 65 54 65 72 6d 73 28 64 62 2c 20 70 53 75  ereTerms(db, pSu
21500 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67  bq, pWhere->pRig
21510 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht, iCursor);.  
21520 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
21530 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
21540 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
21550 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
21560 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
21570 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
21580 6f 6e 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71  on 5 */.  if( sq
21590 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
215a0 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c  Constant(pWhere,
215b0 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20   iCursor) ){.   
215c0 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68   nChng++;.    wh
215d0 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20  ile( pSubq ){.  
215e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
215f0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
21600 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  here, 0);.      
21610 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
21620 28 64 62 2c 20 70 4e 65 77 2c 20 69 43 75 72 73  (db, pNew, iCurs
21630 6f 72 2c 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  or, pSubq->pELis
21640 74 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 2d  t);.      pSubq-
21650 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
21660 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 53 75  3ExprAnd(db, pSu
21670 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77  bq->pWhere, pNew
21680 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d  );.      pSubq =
21690 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a   pSubq->pPrior;.
216a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
216b0 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64  rn nChng;.}.#end
216c0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
216d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
216e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
216f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
21700 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73  W) */../*.** Bas
21710 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
21720 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66  ts of the AggInf
21730 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  o structure indi
21740 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
21750 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20  st.** argument, 
21760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
21770 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ecks if the foll
21780 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
21790 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71  **.**    * the q
217a0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75  uery contains ju
217b0 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72  st a single aggr
217c0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a  egate function,.
217d0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72  **    * the aggr
217e0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
217f0 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f  s either min() o
21800 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20  r max(), and.** 
21810 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e     * the argumen
21820 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
21830 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
21840 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a   column value..*
21850 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
21860 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75  he above are tru
21870 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52  e, then WHERE_OR
21880 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
21890 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a  RE_ORDERBY_MAX.*
218a0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  * is returned as
218b0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c   appropriate. Al
218c0 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  so, *ppMinMax is
218d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
218e0 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66   the .** list of
218f0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
21900 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  d to the aggrega
21910 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  te before return
21920 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ing..**.** Or, i
21930 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  f the conditions
21940 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d   above are not m
21950 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  et, *ppMinMax is
21960 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
21970 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
21980 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65  ORMAL is returne
21990 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  d..*/.static u8 
219a0 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49  minMaxQuery(AggI
219b0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45  nfo *pAggInfo, E
219c0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
219d0 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
219e0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
219f0 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20  NORMAL;         
21a00 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21a10 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78   */..  *ppMinMax
21a20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67   = 0;.  if( pAgg
21a30 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29  Info->nFunc==1 )
21a40 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
21a50 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  r = pAggInfo->aF
21a60 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a  unc[0].pExpr; /*
21a70 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
21a80 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  ion */.    ExprL
21a90 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45  ist *pEList = pE
21aa0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
21ab0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
21ac0 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
21ad0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
21ae0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
21af0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
21b00 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
21b10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
21b20 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
21b30 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  .pExpr->op==TK_A
21b40 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
21b50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21b60 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e  Func = pExpr->u.
21b70 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  zToken;.      if
21b80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
21b90 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
21ba0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
21bb0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
21bc0 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MIN;.        *
21bd0 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
21be0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
21bf0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21c00 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
21c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
21c20 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21c30 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  BY_MAX;.        
21c40 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
21c50 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
21c60 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
21c70 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c   *ppMinMax==0 ||
21c80 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45   (*ppMinMax)->nE
21c90 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  xpr==1 );.  retu
21ca0 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
21cb0 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
21cc0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
21cd0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
21ce0 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
21cf0 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
21d00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21d10 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
21d20 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
21d30 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
21d40 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
21d50 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
21d60 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
21d70 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
21d80 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
21d90 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
21da0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
21db0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
21dc0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
21dd0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
21de0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
21df0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
21e00 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
21e10 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
21e20 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
21e30 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
21e40 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
21e50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21e60 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
21e70 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
21e80 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
21e90 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
21ea0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
21eb0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
21ec0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
21ed0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
21ee0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
21ef0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
21f00 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
21f10 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
21f20 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
21f30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
21f40 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
21f50 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
21f60 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
21f70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
21f80 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
21f90 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
21fa0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
21fb0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
21fc0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
21fd0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
21fe0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
21ff0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
22000 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
22010 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
22020 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
22030 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
22040 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
22050 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
22060 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
22070 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
22080 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
22090 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
220a0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
220b0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
220c0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
220d0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
220e0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
220f0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
22100 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
22110 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
22120 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
22130 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
22140 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
22150 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
22160 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
22170 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
22180 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
22190 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
221a0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
221b0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
221c0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
221d0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
221e0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
221f0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
22200 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
22210 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
22220 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22230 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
22240 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
22250 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49  && pFrom->fg.isI
22260 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
22270 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
22280 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
22290 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20  har *zIndexedBy 
222a0 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64  = pFrom->u1.zInd
222b0 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65  exedBy;.    Inde
222c0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
222d0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
222e0 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
222f0 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
22300 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
22310 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20   zIndexedBy); . 
22320 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
22330 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
22340 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
22350 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22360 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
22370 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
22380 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30  ", zIndexedBy, 0
22390 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
223a0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
223b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
223c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
223d0 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
223e0 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  BIndex = pIdx;. 
223f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22400 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
22410 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
22420 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
22430 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
22440 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
22450 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
22460 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
22470 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
22480 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
22490 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
224a0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
224b0 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
224c0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
224d0 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
224e0 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
224f0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22500 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
22510 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
22520 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
22530 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
22540 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
22550 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
22560 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
22570 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
22580 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
22590 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
225a0 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
225b0 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
225c0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
225d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
225e0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
225f0 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
22600 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
22610 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
22620 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
22630 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
22640 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
22650 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
22660 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
22670 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
22680 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
22690 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
226a0 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
226b0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
226c0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
226d0 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
226e0 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
226f0 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
22700 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
22710 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
22720 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
22730 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
22740 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
22750 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
22760 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
22770 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
22780 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
22790 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
227a0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
227b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
227c0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
227d0 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
227e0 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
227f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
22800 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
22810 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
22820 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
22830 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
22840 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
22850 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22860 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
22870 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
22880 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
22890 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
228a0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
228b0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
228c0 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
228d0 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
228e0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
228f0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
22900 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
22910 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
22920 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
22930 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
22940 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
22950 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
22960 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
22970 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
22980 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
22990 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
229a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
229b0 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
229c0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
229d0 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
229e0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
229f0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
22a00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
22a10 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
22a20 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
22a30 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
22a40 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
22a50 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
22a60 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
22a70 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
22a80 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
22a90 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
22aa0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
22ab0 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
22ac0 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
22ad0 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
22ae0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22af0 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
22b00 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
22b10 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
22b20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22b30 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
22b40 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
22b50 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30  , TK_ASTERISK, 0
22b60 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
22b70 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
22b80 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
22b90 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
22ba0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
22bb0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
22bc0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
22bd0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
22be0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
22bf0 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d  >pWith = 0;.  p-
22c00 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
22c10 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
22c20 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
22c30 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
22c40 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
22c50 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76  Flags |= SF_Conv
22c60 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28  erted;.  assert(
22c70 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30   pNew->pPrior!=0
22c80 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69   );.  pNew->pPri
22c90 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22ca0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
22cb0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
22cc0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74  ffset = 0;.  ret
22cd0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
22ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
22cf0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
22d00 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
22d10 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
22d20 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
22d30 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
22d40 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
22d50 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
22d60 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
22d70 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
22d80 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
22d90 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
22da0 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
22db0 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
22dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
22dd0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
22de0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
22df0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22e00 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
22e10 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
22e20 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
22e30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22e40 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
22e50 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
22e60 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
22e70 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
22e80 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
22e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22ea0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
22eb0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
22ec0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
22ed0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
22ee0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
22ef0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
22f00 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
22f10 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
22f20 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
22f30 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
22f40 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
22f50 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
22f60 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
22f70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
22f80 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
22f90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
22fa0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
22fb0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
22fc0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
22fd0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
22fe0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
22ff0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
23000 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
23010 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
23020 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
23030 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
23040 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
23050 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
23060 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
23070 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
230a0 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
230b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
230c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
230d0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
230e0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
230f0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
23100 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
23130 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
23140 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
23150 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
23160 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
23170 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
23180 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
23190 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
231a0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
231b0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
231c0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
231d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
231e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
231f0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
23200 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23210 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
23220 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
23230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
23240 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
23250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
23260 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
23270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23280 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23290 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
232a0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
232b0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
232c0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
232d0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
232e0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
232f0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
23300 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
23310 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
23320 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
23330 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
23340 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23350 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
23360 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
23370 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
23380 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
23390 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
233a0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
233b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
233c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
233d0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
233e0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
233f0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
23400 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
23410 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
23420 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
23430 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
23440 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
23450 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
23460 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
23470 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
23480 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
23490 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
234a0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
234b0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
234c0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
234d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
234e0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
234f0 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
23500 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
23510 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
23520 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
23530 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
23540 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
23550 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
23560 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
23570 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
23580 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
23590 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
235a0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
235b0 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
235c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
235d0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
235e0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
235f0 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
23600 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
23610 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
23620 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
23630 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
23640 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
23650 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
23660 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
23670 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
23680 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
23690 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
236a0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
236b0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
236c0 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
236d0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
236e0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
236f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
23700 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
23710 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
23720 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
23730 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
23740 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
23750 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
23760 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
23770 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
23780 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
23790 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
237a0 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
237b0 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
237c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
237d0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
237e0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
237f0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
23800 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
23810 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
23820 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
23830 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
23840 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
23850 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
23860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23870 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
23880 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
23890 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
238a0 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
238b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
238c0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
238d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
238e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
238f0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23910 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
23920 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
23930 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
23940 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
23950 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
23960 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
23970 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
23980 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
23990 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
239a0 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
239b0 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
239c0 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
239d0 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
239e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
239f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
23a00 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
23a10 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
23a20 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
23a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
23a40 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
23a50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
23a60 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
23a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23a80 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
23a90 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
23aa0 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
23ab0 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23ad0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
23ae0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
23af0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
23b00 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
23b10 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
23b20 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
23b30 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
23b40 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
23b50 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
23b60 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
23b70 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
23b80 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
23b90 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
23ba0 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
23bb0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
23bc0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
23bd0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
23be0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
23bf0 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
23c00 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
23c10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23c20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23c30 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
23c40 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
23c50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23c60 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
23c70 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
23c80 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
23c90 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
23ca0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
23cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
23cc0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
23cd0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
23ce0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
23cf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
23d00 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
23d10 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
23d20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23d30 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  t;.    pTab->nRe
23d40 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  f = 1;.    pTab-
23d50 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
23d60 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74  DbStrDup(db, pCt
23d70 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  e->zName);.    p
23d80 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
23d90 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  .    pTab->nRowL
23da0 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
23db0 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
23dc0 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
23dd0 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
23de0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
23df0 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69  emeral | TF_NoVi
23e00 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20  sibleRowid;.    
23e10 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
23e20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
23e30 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
23e40 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
23e50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23e60 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
23e70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
23e80 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
23e90 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
23ea0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
23eb0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
23ec0 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
23ed0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
23ee0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
23ef0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
23f00 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
23f10 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
23f20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
23f30 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
23f40 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
23f50 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
23f60 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
23f70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
23f80 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
23f90 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
23fa0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23fb0 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
23fc0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
23fd0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
23fe0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
23ff0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
24000 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
24010 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
24020 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
24030 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
24040 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24050 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
24060 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
24070 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65    pItem->fg.isRe
24080 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
24090 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65         pTab->nRe
240a0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
240b0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
240c0 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
240d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
240e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
240f0 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
24100 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
24110 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
24120 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
24130 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >2 ){.      sqli
24140 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
24150 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22         pParse, "
24160 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
24170 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65  ces to recursive
24180 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74   table: %s", pCt
24190 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e->zName.      )
241a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
241b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
241c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
241d0 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20  Tab->nRef==1 || 
241e0 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
241f0 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
24200 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20  & pTab->nRef==2 
24210 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
24220 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
24230 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
24240 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
24250 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
24260 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
24270 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
24280 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
24290 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61  ect(pWalker, bMa
242a0 79 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65  yRecursive ? pSe
242b0 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c  l->pPrior : pSel
242c0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
242d0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
242e0 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
242f0 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
24300 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
24310 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
24320 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
24330 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
24340 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
24350 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
24360 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
24370 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
24380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24390 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
243a0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
243b0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
243c0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
243d0 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
243e0 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
243f0 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
24400 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
24410 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
24420 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
24430 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
24440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
24450 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
24460 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
24470 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
24480 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
24490 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
244a0 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
244b0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
244c0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
244d0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
244e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
244f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24500 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
24510 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
24520 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
24530 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24540 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
24550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
24560 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
24570 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
24580 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
24590 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
245a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
245b0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
245c0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
245d0 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
245e0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
245f0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
24600 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
24610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24620 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
24630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24640 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
24650 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
24660 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24670 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
24680 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
24690 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
246a0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
246b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
246c0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
246d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
246e0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
246f0 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
24700 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
24710 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
24720 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
24730 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
24740 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
24750 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
24760 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
24770 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
24780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
24790 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
247a0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
247b0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
247c0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
247d0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
247e0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
247f0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
24800 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
24810 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
24820 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
24830 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
24840 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24850 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
24860 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
24870 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
24880 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
24890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
248a0 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
248b0 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
248c0 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
248d0 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
248e0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
248f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
24900 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
24910 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
24920 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
24930 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
24940 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
24950 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
24960 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
24970 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
24980 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
24990 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
249a0 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
249b0 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
249c0 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
249d0 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
249e0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
249f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
24a00 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
24a10 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
24a20 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
24a30 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
24a40 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24a50 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
24a60 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
24a70 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
24a80 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
24a90 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
24aa0 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
24ab0 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
24ac0 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
24ad0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
24ae0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
24af0 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
24b00 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
24b10 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
24b20 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
24b30 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
24b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
24b50 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
24b60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24b70 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
24b80 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
24b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
24ba0 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
24bb0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
24bc0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
24bd0 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
24be0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
24bf0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
24c00 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
24c10 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
24c20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
24c30 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
24c40 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
24c50 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
24c60 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
24c70 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
24c80 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
24c90 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
24ca0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
24cb0 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
24cc0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
24cd0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
24ce0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
24cf0 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
24d00 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24d10 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24d20 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24d30 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
24d40 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
24d50 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
24d60 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24d70 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24d80 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
24d90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24da0 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
24db0 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
24dc0 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
24dd0 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
24de0 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
24df0 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
24e00 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
24e10 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
24e20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24e30 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
24e40 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
24e50 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
24e60 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
24e70 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
24e80 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
24e90 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24ea0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
24eb0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61  EList;.  if( pWa
24ec0 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c  lker->xSelectCal
24ed0 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f  lback2==selectPo
24ee0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
24ef0 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
24f00 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f  rse, findRightmo
24f10 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29  st(p)->pWith, 0)
24f20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
24f30 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
24f40 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
24f50 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
24f60 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
24f70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
24f80 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24f90 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
24fa0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
24fb0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
24fc0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
24fd0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
24fe0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
24ff0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25000 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
25010 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
25020 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
25030 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
25040 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
25050 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
25060 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
25070 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
25080 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
25090 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
250a0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
250b0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
250c0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
250d0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
250e0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
250f0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
25100 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
25110 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
25120 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
25130 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
25140 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
25150 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
25160 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
25170 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
25180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25190 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
251a0 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
251b0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
251c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
251d0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
251e0 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
251f0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25200 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
25210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25220 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
25230 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
25240 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
25250 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
25260 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
25270 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
25280 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
25290 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
252a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
252b0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
252c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
252d0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
252e0 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
252f0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25300 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
25310 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
25320 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
25330 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
25340 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
25350 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
25360 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
25370 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
25380 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
25390 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
253a0 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
253b0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
253c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
253d0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
253e0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
253f0 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  r; }.      sqlit
25400 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
25410 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
25420 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62  el->pEList,&pTab
25430 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43  ->nCol,&pTab->aC
25440 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
25450 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
25460 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
25470 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
25480 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
25490 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
254a0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
254b0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
254c0 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
254d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
254e0 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
254f0 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
25500 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
25510 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
25520 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
25530 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
25540 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
25550 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
25560 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
25570 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
25580 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
25590 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
255a0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
255b0 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
255c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
255d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
255e0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
255f0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
25600 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
25610 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
25620 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
25630 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
25640 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25650 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
25660 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
25670 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
25680 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
25690 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e  ) && cannotBeFun
256a0 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
256b0 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rom) ){.        
256c0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
256d0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
256e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
256f0 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
25700 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
25710 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
25720 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
25730 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61  ual(pTab) || pTa
25740 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
25750 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a        i16 nCol;.
25760 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
25770 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
25780 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
25790 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
257a0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
257b0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
257c0 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
257d0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
257e0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
257f0 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
25800 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
25810 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
25820 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d  ectSetName(pFrom
25830 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d  ->pSelect, pTab-
25840 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
25850 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
25860 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
25870 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
25880 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25890 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
258a0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
258b0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
258c0 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
258d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
258e0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
258f0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
25900 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
25910 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
25920 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
25930 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
25940 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
25950 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
25960 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
25970 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
25980 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
25990 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
259a0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
259b0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
259c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
259d0 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
259e0 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
259f0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
25a00 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25a10 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
25a20 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
25a30 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
25a40 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
25a50 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
25a60 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
25a70 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
25a80 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
25a90 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
25aa0 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
25ab0 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
25ac0 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
25ad0 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
25ae0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
25af0 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
25b00 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
25b10 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
25b20 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
25b30 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
25b40 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
25b50 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
25b60 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
25b70 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
25b80 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
25b90 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
25ba0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
25bb0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
25bc0 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
25bd0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
25be0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
25bf0 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
25c00 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
25c10 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
25c20 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
25c30 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
25c40 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
25c50 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
25c60 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
25c70 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
25c80 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
25c90 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
25ca0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25cb0 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
25cc0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
25cd0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25ce0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
25cf0 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
25d00 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
25d10 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
25d20 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
25d30 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
25d40 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
25d50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
25d60 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
25d70 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
25d80 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
25d90 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
25da0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
25db0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
25dc0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
25dd0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
25de0 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
25df0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
25e00 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
25e10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
25e20 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
25e30 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
25e40 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
25e50 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
25e60 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
25e70 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
25e80 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
25e90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
25ea0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
25eb0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
25ec0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
25ed0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ef0 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
25f00 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
25f10 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
25f20 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
25f30 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
25f40 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
25f50 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
25f60 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
25f70 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25f80 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
25f90 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
25fa0 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
25fb0 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20  ASTERISK.       
25fc0 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
25fd0 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
25fe0 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20  !=TK_ASTERISK). 
25ff0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26000 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
26010 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
26020 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
26030 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
26040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
26050 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
26060 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
26070 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
26080 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
26090 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
260a0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
260b0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
260c0 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
260d0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
260e0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
260f0 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
26100 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
26110 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
26120 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
26130 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
26140 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
26150 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
26160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26170 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
26180 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
26190 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
261a0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
261b0 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
261c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
261d0 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
261e0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
261f0 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
26200 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
26210 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
26220 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
26230 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
26240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
26250 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
26260 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26270 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
26280 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26290 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
262a0 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
262b0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
262c0 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
262d0 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
262e0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
262f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
26300 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
26310 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
26320 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
26330 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
26340 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
26350 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
26360 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
26370 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
26380 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
26390 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
263a0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
263b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
263c0 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
263d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
263e0 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
263f0 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
26400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26410 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
26420 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
26430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
26440 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26450 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
26460 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
26470 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
26480 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
26490 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
264a0 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
264b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
264c0 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
264d0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
264e0 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
264f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26500 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
26510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26520 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
26530 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
26540 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
26550 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
26560 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
26570 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
26580 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22  iDb].zName : "*"
26590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
265a0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
265b0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
265c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
265d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
265e0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
265f0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26600 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
26610 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
26620 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
26630 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
26640 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
26650 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
26660 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
26670 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
26680 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
26690 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
266a0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
266b0 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
266c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
266d0 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
266e0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
266f0 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
26700 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
26710 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
26720 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
26730 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
26740 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 0)==0.      
26750 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26760 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
26780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26790 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
267a0 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
267b0 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74  , omit it from t
267c0 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
267d0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
267e0 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73  t-set list unles
267f0 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  s the SELECT has
26800 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48   the SF_IncludeH
26810 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20  idden.          
26820 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20    ** bit set..  
26830 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26840 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d           if( (p-
26850 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49  >selFlags & SF_I
26860 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30  ncludeHidden)==0
26870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
26880 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
26890 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
268a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
268c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
268d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
268e0 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
268f0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26900 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
26910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26920 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
26930 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
26940 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
26960 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
26970 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
26980 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
26990 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
269b0 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
269c0 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
269d0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
269e0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
269f0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
26a00 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
26a10 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
26a20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
26a30 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
26a40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26a50 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
26a60 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
26a70 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
26a80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26a90 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
26aa0 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
26ab0 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
26ac0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
26ad0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
26ae0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
26af0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
26b00 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
26b10 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26b20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
26b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26b40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26b50 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
26b60 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
26b70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26b80 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
26b90 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
26ba0 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
26bb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
26bc0 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
26bd0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
26bf0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
26c00 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
26c10 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26c20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
26c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26c40 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
26c50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
26c60 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
26c70 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
26c80 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
26c90 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
26ca0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
26cb0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26cc0 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
26cd0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26ce0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
26cf0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
26d00 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
26d10 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
26d20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26d30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
26d40 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
26d50 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
26d60 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
26d70 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
26d80 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
26d90 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26da0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
26db0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
26dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26dd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26de0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26df0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
26e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26e10 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
26e20 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
26e30 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
26e40 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
26e50 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
26e60 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
26e70 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
26e80 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
26e90 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
26ea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26eb0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
26ec0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
26ed0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
26ee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
26ef0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
26f00 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
26f10 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
26f20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
26f30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
26f40 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
26f50 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
26f60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
26f70 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
26f80 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
26f90 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
26fa0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
26fb0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
26fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26fd0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
26fe0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
26ff0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
27020 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
27030 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27060 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
27070 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
27080 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
27090 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
270a0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
270b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
270c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
270d0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
270e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
270f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
27100 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27110 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
27120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27130 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
27140 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
27150 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
27160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
27170 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27180 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
27190 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
271a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
271b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
271c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
271d0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
271e0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
271f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27210 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27220 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
27230 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
27240 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
27250 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
27260 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
27270 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
27280 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
27290 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
272a0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
272b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
272c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
272d0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
272e0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
272f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
27300 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64  _Abort;.  }.#end
27310 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
27320 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
27330 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
27340 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
27350 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
27360 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
27370 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
27380 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
27390 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
273a0 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
273b0 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
273c0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
273d0 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
273e0 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
273f0 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
27400 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
27410 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
27420 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
27430 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
27440 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
27450 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
27460 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
27470 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
27480 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
27490 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
274a0 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
274b0 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
274c0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
274d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
274e0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
274f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
27500 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
27510 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27520 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
27530 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
27540 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
27550 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
27560 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
27570 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
27580 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
27590 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
275a0 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
275b0 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
275c0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
275d0 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
275e0 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
275f0 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
27600 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
27610 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
27620 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
27630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
27640 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
27650 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
27660 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
27670 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
27680 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
27690 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
276a0 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
276b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
276c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
276d0 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
276e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
276f0 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
27700 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
27710 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
27720 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
27730 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
27740 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
27750 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
27760 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
27770 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
27780 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
27790 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
277a0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
277b0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
277c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
277d0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
277e0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
277f0 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
27800 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
27810 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
27820 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
27830 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
27840 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
27850 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27860 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
27870 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
27880 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
27890 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d  .  if( (pSelect-
278a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d  >selFlags & SF_M
278b0 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  ultiValue)==0 ){
278c0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
278d0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
278e0 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73  PopWith;.  }.  s
278f0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
27900 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
27910 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
27920 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27930 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
27940 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
27950 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
27960 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
27970 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
27980 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
27990 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
279a0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
279b0 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
279c0 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
279d0 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
279e0 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
279f0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
27a00 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
27a10 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
27a20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
27a30 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
27a40 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
27a50 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
27a60 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
27a70 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
27a80 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
27a90 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
27aa0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
27ab0 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
27ac0 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
27ad0 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
27ae0 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
27af0 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
27b00 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
27b10 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
27b20 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
27b30 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27b40 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
27b50 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
27b60 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
27b70 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
27b80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
27b90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
27ba0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
27bb0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
27bc0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
27bd0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
27be0 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
27bf0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
27c00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
27c10 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
27c20 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
27c30 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
27c40 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
27c50 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
27c60 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
27c70 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
27c80 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
27c90 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
27ca0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
27cb0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
27cc0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27cd0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
27ce0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
27cf0 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
27d00 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
27d10 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
27d20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
27d30 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27d40 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
27d50 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
27d60 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
27d70 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
27d80 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
27d90 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
27da0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
27db0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
27dc0 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75     selectAddColu
27dd0 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
27de0 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
27df0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
27e00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
27e10 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
27e20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
27e30 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
27e40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
27e50 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
27e60 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
27e70 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
27e80 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
27e90 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
27ea0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
27eb0 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
27ec0 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
27ed0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
27ee0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
27ef0 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
27f00 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
27f10 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
27f20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
27f30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
27f40 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
27f50 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27f60 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
27f70 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
27f80 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
27f90 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
27fa0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
27fb0 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
27fc0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
27fd0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
27fe0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
27ff0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
28000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
28010 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
28020 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28030 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
28040 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
28050 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
28060 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
28070 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
28080 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
28090 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
280a0 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
280b0 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
280c0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
280d0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
280e0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
280f0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
28100 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
28110 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
28120 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
28130 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
28140 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
28150 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
28160 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
28170 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
28180 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
28190 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
281a0 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
281b0 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
281c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
281d0 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
281e0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
281f0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
28200 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
28210 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
28220 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
28230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28240 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
28250 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
28260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28270 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28280 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
28290 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
282a0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
282b0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
282c0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
282d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
282e0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
282f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
28300 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
28310 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
28320 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
28330 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
28340 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
28350 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
28360 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
28370 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
28380 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
28390 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
283a0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
283b0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
283c0 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
283d0 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
283e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
283f0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
28400 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
28410 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
28420 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
28430 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
28440 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
28450 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
28460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
28470 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
28480 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
28490 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
284a0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
284b0 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
284c0 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
284d0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
284e0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
284f0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
28500 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
28510 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
28520 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
28530 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
28540 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
28550 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
28560 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
28570 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
28580 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28590 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
285a0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
285b0 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
285c0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
285d0 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
285e0 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
285f0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
28600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28610 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
28620 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
28630 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
28640 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
28650 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
28660 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
28670 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
28680 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
28690 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
286a0 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
286b0 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
286c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
286d0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
286e0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
286f0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
28700 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
28710 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
28720 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
28730 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
28740 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
28750 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
28760 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
28770 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
28780 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
28790 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
287a0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
287b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
287c0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
287d0 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
287e0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
287f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
28800 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
28810 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
28820 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
28830 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
28840 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
28850 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28860 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
28870 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
28880 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
28890 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
288a0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
288b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
288c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
288d0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
288e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
288f0 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
28900 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
28910 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
28920 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28930 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
28940 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
28950 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
28960 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
28970 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
28980 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
28990 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
289a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
289b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
289c0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
289d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
289e0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
289f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
28a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
28a10 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
28a20 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
28a30 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
28a60 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
28a70 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
28a80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
28a90 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
28aa0 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
28ab0 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
28ac0 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
28ad0 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
28ae0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
28af0 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
28b00 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
28b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
28b20 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
28b30 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
28b40 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
28b50 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
28b60 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
28b70 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
28b80 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
28b90 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28ba0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
28bb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
28bc0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
28bd0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
28be0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28bf0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
28c00 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
28c10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28c20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
28c30 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
28c40 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
28c50 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
28c80 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
28c90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28ca0 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
28cb0 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
28cc0 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
28cd0 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
28ce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
28cf0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
28d00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
28d10 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
28d20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
28d30 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
28d40 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
28d50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
28d60 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
28d70 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
28d80 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
28d90 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
28da0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
28db0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
28dc0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
28dd0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
28de0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
28df0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
28e00 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
28e10 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
28e20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
28e30 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
28e40 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
28e50 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
28e60 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
28e70 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
28e80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
28e90 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
28ea0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
28eb0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
28ec0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
28ed0 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
28ee0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
28ef0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
28f00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
28f10 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
28f20 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
28f30 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
28f40 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49   regAgg, 0, SQLI
28f50 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
28f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
28f70 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
28f80 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
28f90 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
28fa0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
28fb0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
28fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28fd0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
28fe0 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29  tcase( nArg==0 )
28ff0 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64  ;  /* Error cond
29000 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74  ition */.      t
29010 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20  estcase( nArg>1 
29020 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20  );   /* Also an 
29030 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63  error */.      c
29040 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
29050 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
29060 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
29070 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
29080 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
29090 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
290a0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
290b0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
290c0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
290d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
290e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
290f0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
29100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
29110 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
29120 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
29130 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
29140 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
29150 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
29160 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
29170 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
29180 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
29190 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
291a0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
291b0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
291c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
291d0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
291e0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
291f0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
29200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29210 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
29220 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
29230 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
29240 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29260 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
29270 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
29280 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
29290 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
292a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
292b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
292c0 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30  , OP_AggStep0, 0
292d0 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
292e0 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
292f0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
29300 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
29310 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
29320 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
29330 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
29340 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
29350 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
29360 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
29370 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
29380 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
29390 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
293a0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
293b0 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
293c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
293d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
293e0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
293f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
29400 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
29410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29420 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
29430 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
29440 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
29450 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
29460 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
29470 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
29480 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
29490 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
294a0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
294b0 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
294c0 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
294d0 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
294e0 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
294f0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
29500 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
29510 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
29520 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
29530 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
29540 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
29550 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
29560 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
29570 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
29580 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
29590 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
295a0 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
295b0 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
295c0 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
295d0 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
295e0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
295f0 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
29600 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
29610 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
29620 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
29630 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
29640 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
29650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
29660 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
29670 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
29680 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
29690 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
296a0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
296b0 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
296c0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
296d0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
296e0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
296f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
29700 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
29710 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
29720 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
29730 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20  irectMode = 0;. 
29740 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
29750 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
29760 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73    if( addrHitTes
29770 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
29780 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
29790 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20  addrHitTest);.  
297a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
297b0 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
297c0 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
297d0 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
297e0 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
297f0 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
29800 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
29810 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
29820 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
29830 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
29840 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
29850 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
29860 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
29890 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
298a0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
298b0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
298c0 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
298d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
29900 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
29910 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
29920 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
29930 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
29940 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70   int bCover = (p
29950 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f  Idx!=0 && (HasRo
29960 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73  wid(pTab) || !Is
29970 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
29980 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61  pIdx)));.    cha
29990 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65  r *zEqp = sqlite
299a0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
299b0 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  >db, "SCAN TABLE
299c0 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
299d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
299e0 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
299f0 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
29a00 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
29a10 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
29a20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
29a30 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
29a40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
29a50 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
29a60 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
29a70 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
29a80 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
29a90 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
29aa0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
29ab0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
29ac0 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
29ad0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
29ae0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
29af0 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
29b00 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
29b10 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
29b20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
29b30 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  lts are returned
29b40 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
29b50 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
29b60 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63  ucture..** See c
29b70 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74  omments in sqlit
29b80 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68  eInt.h for furth
29b90 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  er information..
29ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29bb0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
29bc0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
29bd0 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
29be0 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
29bf0 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
29c00 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
29c10 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
29c20 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
29c30 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
29c40 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
29c50 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
29c60 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
29c70 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
29c80 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
29c90 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
29ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
29cb0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
29cc0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29cd0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
29ce0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
29cf0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
29d00 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
29d10 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
29d20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
29d30 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
29d40 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
29d50 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
29d60 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
29d70 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
29d80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
29d90 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
29da0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
29db0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
29dc0 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
29dd0 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
29de0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
29df0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
29e00 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
29e10 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
29e20 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
29e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29e40 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
29e50 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
29e60 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
29e70 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a  *pEList = 0;  /*
29e80 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
29e90 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
29ea0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
29eb0 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
29ec0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
29ed0 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
29ee0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
29ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
29f00 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
29f10 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
29f20 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
29f30 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
29f40 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
29f50 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
29f60 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
29f70 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
29f80 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
29f90 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
29fa0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
29fb0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
29fc0 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
29fd0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
29fe0 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
29ff0 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
2a000 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
2a010 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
2a020 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73  d */.  SortCtx s
2a030 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Sort;         /*
2a040 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
2a050 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42  code the ORDER B
2a060 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67  Y clause */.  Ag
2a070 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
2a080 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
2a090 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
2a0a0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
2a0b0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
2a0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2a0d0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
2a0e0 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
2a0f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2a100 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a110 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2a120 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
2a130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2a140 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
2a150 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
2a160 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
2a170 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
2a180 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
2a190 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
2a1a0 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
2a1b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
2a1c0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
2a1d0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
2a1e0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
2a1f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2a200 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2a210 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2a220 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
2a230 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
2a240 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
2a250 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
2a260 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
2a270 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2a280 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  ED.  pParse->nSe
2a290 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20  lectIndent++;.  
2a2a0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2a2b0 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20  arse,p, ("begin 
2a2c0 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29  processing:\n"))
2a2d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
2a2e0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2a2f0 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
2a300 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2a310 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2a320 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2a330 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2a340 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2a350 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
2a360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2a370 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2a380 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69  t->eDest!=SRT_Fi
2a390 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
2a3a0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2a3b0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2a3c0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
2a3d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2a3e0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2a3f0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51  st->eDest!=SRT_Q
2a400 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67  ueue );.  if( Ig
2a410 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2a420 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
2a430 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
2a440 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
2a450 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a460 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
2a470 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2a480 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
2a490 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2a4a0 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a  =SRT_Discard ||.
2a4b0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2a4c0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65  ->eDest==SRT_Que
2a4d0 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ue  || pDest->eD
2a4e0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
2a4f0 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  o ||.           
2a500 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a510 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70  T_DistQueue || p
2a520 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2a530 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49  _Fifo);.    /* I
2a540 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
2a550 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
2a560 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
2a570 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
2a580 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
2a590 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
2a5a0 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
2a5b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2a5c0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
2a5d0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
2a5e0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2a5f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2a600 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2a610 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
2a620 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
2a630 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73   0);.  memset(&s
2a640 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Sort, 0, sizeof(
2a650 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74  sSort));.  sSort
2a660 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2a670 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c  OrderBy;.  pTabL
2a680 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2a690 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2a6a0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2a6b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2a6c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a6d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2a6e0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73  EList!=0 );.  is
2a6f0 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
2a700 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2a710 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43  e)!=0;.#if SELEC
2a720 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2a730 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2a740 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2a750 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2a760 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2a770 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20  p, ("after name 
2a780 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29  resolution:\n"))
2a790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2a7a0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2a7b0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2a7c0 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ...  /* If writi
2a7d0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
2a7e0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
2a7f0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
2a800 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
2a810 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
2a820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a830 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
2a840 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
2a850 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
2a860 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
2a870 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2a880 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
2a890 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
2a8a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74  ndif..  /* Try t
2a8b0 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65  o flatten subque
2a8c0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2a8d0 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20   clause up into 
2a8e0 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20  the main query. 
2a8f0 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
2a900 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
2a910 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
2a920 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2a930 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
2a940 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
2a950 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2a960 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2a970 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2a980 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2a990 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2a9a0 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2a9b0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
2a9c0 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20  nt isAggSub;.   
2a9d0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2a9e0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
2a9f0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
2aa00 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2aa10 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69  Catch mismatch i
2aa20 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63  n the declared c
2aa30 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77  olumns of a view
2aa40 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
2aa50 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  of.    ** column
2aa60 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
2aa70 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  on the RHS */.  
2aa80 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
2aa90 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  !=pSub->pEList->
2aaa0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
2aab0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2aac0 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64  Parse, "expected
2aad0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20   %d columns for 
2aae0 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22  '%s' but got %d"
2aaf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ab00 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
2ab10 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  ol, pTab->zName,
2ab20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
2ab30 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74  Expr);.      got
2ab40 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2ab50 20 20 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75    }..    isAggSu
2ab60 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
2ab70 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2ab80 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
2ab90 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
2aba0 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
2abb0 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
2abc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2abd0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
2abe0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
2abf0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
2ac00 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
2ac10 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
2ac20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
2ac30 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2ac40 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
2ac50 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
2ac60 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
2ac70 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2ac80 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2ac90 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2aca0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2acb0 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
2acc0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
2acd0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
2ace0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2acf0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
2ad00 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20  dif..  /* Get a 
2ad10 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42 45  pointer the VDBE
2ad20 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2ad30 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20  ion, allocating 
2ad40 61 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e  a new VDBE if on
2ad50 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  e.  ** does not 
2ad60 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f  already exist */
2ad70 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
2ad80 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
2ad90 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
2ada0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69   select_end;..#i
2adb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2adc0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2add0 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2ade0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2adf0 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2ae00 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2ae10 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2ae20 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2ae30 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2ae40 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2ae50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2ae60 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2ae70 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2ae80 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2ae90 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2aea0 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2aeb0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2aec0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2aed0 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2aee0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2aef0 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2af00 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c      pParse->nSel
2af10 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
2af20 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
2af30 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2af40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2af50 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
2af60 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
2af70 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
2af80 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2af90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2afa0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2afb0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2afc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2afd0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2afe0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
2aff0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2b000 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2b010 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
2b020 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
2b030 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
2b040 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2b050 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
2b060 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2b070 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
2b080 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
2b090 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
2b0a0 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
2b0b0 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
2b0c0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
2b0d0 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
2b0e0 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
2b0f0 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
2b100 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
2b110 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
2b120 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
2b130 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
2b140 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
2b150 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
2b160 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
2b170 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
2b180 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
2b190 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
2b1a0 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
2b1b0 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
2b1c0 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
2b1d0 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
2b1e0 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
2b1f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
2b200 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
2b210 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
2b220 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2b230 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
2b240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b250 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2b260 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b270 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
2b280 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
2b290 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2b2a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
2b2b0 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
2b2c0 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
2b2d0 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
2b2e0 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
2b2f0 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
2b300 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
2b310 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
2b320 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
2b330 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
2b340 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
2b350 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
2b360 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
2b370 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
2b380 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
2b390 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
2b3a0 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
2b3b0 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
2b3c0 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
2b3d0 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
2b3e0 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
2b3f0 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
2b400 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
2b410 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
2b420 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2b430 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
2b440 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    /* Make copies
2b450 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45   of constant WHE
2b460 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE-clause terms 
2b470 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
2b480 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69  ry down.    ** i
2b490 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65  nside the subque
2b4a0 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65  ry.  This can he
2b4b0 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20  lp the subquery 
2b4c0 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69  to run more effi
2b4d0 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ciently..    */.
2b4e0 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2b4f0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2b500 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20  _OUTER)==0.     
2b510 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  && pushDownWhere
2b520 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 2c 20  Terms(db, pSub, 
2b530 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2b540 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29  ->iCursor).    )
2b550 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2b560 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2b570 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2b580 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2b590 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2b5a0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2b5b0 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2b5c0 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2b5d0 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2b5e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2b5f0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2b600 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2b610 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
2b620 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2b630 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
2b640 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20  ubquery.    */. 
2b650 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
2b660 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 26 26  >nSrc==1.     &&
2b670 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2b680 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20  SF_All)==0.     
2b690 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2b6a0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2b6b0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2b6c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2b6d0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
2b6e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2b6f0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
2b700 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2b710 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2b720 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
2b730 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
2b740 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
2b750 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2b760 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
2b770 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b780 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2b790 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2b7a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2b7b0 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2b7c0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2b7d0 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2b7e0 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2b7f0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2b800 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2b810 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
2b820 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2b830 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
2b840 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2b850 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2b860 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
2b870 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2b880 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2b890 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2b8a0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2b8b0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2b8c0 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2b8d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2b8e0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2b8f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2b900 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73  ->nRowLogEst = s
2b910 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75  qlite3LogEst(pSu
2b920 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  b->nSelectRow);.
2b930 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2b940 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2b950 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2b960 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2b970 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2b980 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b990 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
2b9a0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2b9b0 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2b9c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2b9d0 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2b9e0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2b9f0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2ba00 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2ba10 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2ba20 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2ba30 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2ba40 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2ba50 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2ba60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2ba70 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2ba80 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2ba90 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2baa0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2bab0 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2bac0 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2bad0 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2bae0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2baf0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2bb00 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2bb10 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2bb20 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2bb30 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2bb40 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2bb50 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2bb60 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2bb70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2bb80 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2bb90 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
2bba0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2bbb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2bbc0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
2bbd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2bbe0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2bbf0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
2bc00 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2bc10 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2bc20 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
2bc30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2bc40 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64  >fg.isCorrelated
2bc50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2bc60 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  * If the subquer
2bc70 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61  y is not correla
2bc80 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72  ted and if we ar
2bc90 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a  e not inside of.
2bca0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69          ** a tri
2bcb0 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e  gger, then we on
2bcc0 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  ly need to compu
2bcd0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2bce0 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
2bcf0 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f       ** once. */
2bd00 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64  .        onceAdd
2bd10 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
2bd20 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
2bd30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2bd40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bd50 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2bd60 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2bd70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bd80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bd90 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
2bda0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2bdb0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2bdc0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2bdd0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
2bde0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2bdf0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2be00 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2be10 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2be20 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2be30 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2be40 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2be50 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2be60 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2be70 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2be80 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2be90 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2bea0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2beb0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
2bec0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
2bed0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
2bee0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
2bef0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
2bf00 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
2bf10 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
2bf20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2bf30 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
2bf40 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2bf50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bf60 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
2bf70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2bf80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bf90 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
2bfa0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
2bfb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
2bfc0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
2bfd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2bfe0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2bff0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2c000 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2c010 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
2c020 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
2c030 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
2c040 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c050 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
2c060 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
2c070 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
2c080 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
2c090 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
2c0a0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
2c0b0 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
2c0c0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2c0d0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2c0e0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2c0f0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2c100 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2c110 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2c120 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2c130 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
2c140 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2c150 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2c160 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2c170 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2c180 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2c190 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
2c1a0 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
2c1b0 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
2c1c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2c1d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2c1e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
2c1f0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
2c200 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
2c210 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
2c220 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
2c230 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
2c240 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
2c250 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2c260 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
2c270 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
2c280 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
2c290 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
2c2a0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
2c2b0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
2c2c0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
2c2d0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
2c2e0 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
2c2f0 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
2c300 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
2c310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2c320 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
2c330 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20  .. GROUP BY xyz 
2c340 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2c350 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
2c360 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
2c370 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
2c380 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
2c390 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
2c3a0 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
2c3b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
2c3c0 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
2c3d0 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
2c3e0 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
2c3f0 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
2c400 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
2c410 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
2c420 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
2c430 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
2c440 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
2c450 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
2c460 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2c470 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
2c480 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c490 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
2c4a0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
2c4b0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
2c4c0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
2c4d0 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72  ListCompare(sSor
2c4e0 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69  t.pOrderBy, pELi
2c4f0 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
2c500 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2c510 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
2c520 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
2c530 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2c540 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2c550 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
2c560 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
2c570 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
2c580 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
2c590 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
2c5a0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
2c5b0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
2c5c0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
2c5d0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
2c5e0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
2c5f0 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
2c600 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
2c610 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
2c620 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
2c630 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
2c640 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2c650 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2c660 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2c670 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
2c680 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
2c690 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  en create an eph
2c6a0 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a  emeral index to.
2c6b0 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74    ** do the sort
2c6c0 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73  ing.  But this s
2c6d0 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c  orting ephemeral
2c6e0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
2c6f0 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75   up.  ** being u
2c700 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
2c710 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  a can be extract
2c720 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2c730 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20   order..  ** If 
2c740 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2c750 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70  , then the OP_Op
2c760 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
2c770 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ruction will be.
2c780 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
2c790 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20  an OP_Noop once 
2c7a0 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
2c7b0 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
2c7c0 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  ndex is.  ** not
2c7d0 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53   needed.  The sS
2c7e0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c7f0 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  x variable is us
2c800 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
2c810 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67  .  ** that chang
2c820 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
2c830 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2c840 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2c850 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
2c860 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2c870 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2c880 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2c890 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , 0, pEList->nEx
2c8a0 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69  pr);.    sSort.i
2c8b0 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
2c8c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
2c8d0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c8e0 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
2c8f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2c900 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2c910 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
2c920 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
2c930 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2c940 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
2c950 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
2c960 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2c970 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
2c980 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c990 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2c9a0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
2c9b0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
2c9c0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
2c9d0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
2c9e0 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
2c9f0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
2ca00 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2ca10 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
2ca20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ca30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2ca40 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
2ca50 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
2ca60 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
2ca70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
2ca80 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
2ca90 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2caa0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
2cab0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c  ->nSelectRow = L
2cac0 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
2cad0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
2cae0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
2caf0 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
2cb00 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
2cb10 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2cb20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
2cb30 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
2cb40 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
2cb50 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
2cb60 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
2cb70 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
2cb80 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
2cb90 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
2cba0 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
2cbb0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
2cbc0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
2cbd0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
2cbe0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2cbf0 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2cc00 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2cc10 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2cc20 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
2cc30 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
2cc40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2cc50 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2cc60 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc80 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
2cc90 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2ccc0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2ccd0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
2cce0 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
2cd10 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
2cd20 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2cd30 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
2cd40 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
2cd50 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2cd60 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2cd70 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
2cd80 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2cd90 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2cda0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
2cdb0 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
2cdc0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
2cdd0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
2cde0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2cdf0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
2ce00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
2ce10 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
2ce20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2ce30 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
2ce40 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
2ce50 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
2ce60 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
2ce70 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
2ce80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2ce90 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2cea0 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
2ceb0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ced0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
2cee0 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
2cef0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
2cf00 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2cf10 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2cf20 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2cf30 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2cf40 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2cf50 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2cf60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2cf70 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2cf80 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2cf90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cfa0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2cfb0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2cfc0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2cfd0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2cfe0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2cff0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2d000 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2d010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d020 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2d030 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2d040 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2d050 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2d060 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2d070 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2d080 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2d090 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2d0a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2d0b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2d0c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2d0d0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2d0e0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2d0f0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2d100 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2d110 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2d120 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2d130 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2d140 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2d150 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2d160 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2d170 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2d180 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d190 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2d1a0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2d1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d1c0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d1d0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d1e0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2d1f0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2d200 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2d210 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2d220 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2d230 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2d240 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2d250 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2d260 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d270 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2d280 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2d2b0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2d2c0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2d2d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2d2e0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2d2f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d300 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2d310 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2d320 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2d330 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2d340 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2d350 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2d360 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2d370 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2d380 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2d390 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2d3a0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2d3b0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2d3c0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2d3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2d3e0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2d3f0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2d400 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2d410 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2d420 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d430 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2d440 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2d450 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2d460 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2d470 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2d480 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2d490 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2d4a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2d4b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2d4c0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2d4d0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2d4e0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d500 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2d510 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2d520 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2d530 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2d540 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2d550 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2d560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2d570 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2d580 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2d590 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2d5a0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2d5b0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2d5c0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2d5d0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2d5e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2d5f0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2d600 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2d610 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2d620 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2d630 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2d640 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2d650 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2d660 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2d670 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
2d680 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
2d690 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
2d6a0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
2d6b0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
2d6c0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2d6d0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2d6e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2d6f0 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2d700 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2d710 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2d720 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2d730 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2d760 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2d770 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2d780 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2d790 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2d7a0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2d7b0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2d7c0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2d7d0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2d7e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2d7f0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2d800 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2d810 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2d820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2d830 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2d840 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2d850 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2d860 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2d870 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2d880 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2d890 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2d8a0 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
2d8b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2d8c0 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
2d8d0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
2d8e0 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
2d8f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
2d900 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
2d910 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
2d920 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
2d930 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  hey are.    ** i
2d940 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69  dentical, then i
2d950 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
2d960 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  e to disable the
2d970 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2d980 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20   .    ** on the 
2d990 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65  grounds that the
2d9a0 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63   GROUP BY will c
2d9b0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
2d9c0 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a   come out .    *
2d9d0 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
2d9e0 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20   order. It also 
2d9f0 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52  may not - the GR
2da00 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
2da10 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2da20 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2da30 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2da40 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2da50 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2da60 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2da70 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2da80 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2da90 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2daa0 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2dab0 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2dac0 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2dad0 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2dae0 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2daf0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2db00 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2db10 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2db20 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2db30 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2db40 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2db50 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2db60 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2db70 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2db80 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2db90 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2dba0 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2dbb0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2dbc0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2dbd0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2dbe0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2dbf0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2dc00 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2dc10 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2dc20 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2dc30 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2dc40 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2dc50 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2dc60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2dc70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2dc80 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2dc90 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2dca0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2dcb0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2dcc0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2dcd0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2dce0 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2dcf0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2dd00 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2dd10 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2dd20 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2dd30 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2dd40 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
2dd50 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2dd60 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2dd70 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2dd80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2dd90 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2dda0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2ddb0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2ddc0 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2ddd0 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2dde0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2ddf0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2de00 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2de10 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2de20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2de30 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2de40 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2de50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2de60 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2de70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2de80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2de90 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2dea0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2deb0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2dec0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2ded0 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2dee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2def0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2df00 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2df10 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2df20 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2df30 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2df40 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2df50 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2df60 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2df70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2df80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2df90 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2dfa0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2dfb0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2dfc0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2dfd0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2dfe0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2dff0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2e000 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2e010 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2e020 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2e030 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2e040 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2e050 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2e060 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2e070 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2e080 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2e090 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20     int addr1;   
2e0a0 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2e0b0 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2e0c0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2e0d0 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2e0e0 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2e0f0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2e100 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2e110 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2e120 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2e130 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2e140 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2e150 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2e160 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2e170 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2e180 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2e190 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2e1a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2e1b0 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2e1c0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2e1d0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2e1e0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2e1f0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2e200 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2e210 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2e220 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2e230 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2e240 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2e250 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2e260 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2e270 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2e280 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2e290 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2e2a0 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2e2b0 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2e2c0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2e2d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2e2e0 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2e2f0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2e300 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2e310 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2e320 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2e330 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2e340 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2e350 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2e360 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2e370 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2e380 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2e390 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2e3a0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2e3b0 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2e3c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2e3d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2e3e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2e3f0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2e400 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2e410 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2e420 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49  roupBy, 0, sAggI
2e430 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
2e440 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
2e450 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
2e460 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
2e470 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
2e480 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2e490 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
2e4a0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2e4b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
2e4c0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2e4d0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
2e4e0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
2e4f0 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
2e500 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
2e510 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
2e520 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
2e530 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
2e540 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2e550 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
2e560 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2e570 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
2e580 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
2e590 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e5a0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2e5b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2e5c0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2e5d0 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
2e5e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e5f0 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
2e600 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2e610 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
2e620 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
2e630 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
2e640 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
2e650 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2e660 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
2e670 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2e680 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2e690 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2e6a0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
2e6b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e6c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2e6d0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2e6e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e6f0 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
2e700 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2e710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e720 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2e730 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2e740 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2e750 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
2e760 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
2e770 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e780 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e790 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c  _Null, 0, iAMem,
2e7a0 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d   iAMem+pGroupBy-
2e7b0 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20  >nExpr-1);..    
2e7c0 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
2e7d0 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
2e7e0 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
2e7f0 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
2e800 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
2e810 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
2e820 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
2e830 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
2e840 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
2e850 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
2e860 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
2e870 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
2e880 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
2e890 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
2e8a0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
2e8b0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
2e8c0 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
2e8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2e8e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e8f0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2e900 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2e910 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
2e920 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2e930 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2e940 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  st, pWhere, pGro
2e950 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20  upBy, 0,.       
2e960 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
2e970 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f   | (orderByGrp ?
2e980 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
2e990 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20  UP : 0), 0.     
2e9a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2e9b0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2e9c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
2e9d0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2e9e0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2e9f0 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  o)==pGroupBy->nE
2ea00 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  xpr ){.        /
2ea10 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
2ea20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
2ea30 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
2ea40 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
2ea50 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
2ea60 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
2ea70 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
2ea80 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
2ea90 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
2eaa0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
2eab0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
2eac0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
2ead0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
2eae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
2eaf0 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
2eb00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb10 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
2eb20 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
2eb30 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
2eb40 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
2eb50 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
2eb60 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
2eb70 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
2eb80 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
2eb90 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
2eba0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
2ebb0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2ebc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
2ebd0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
2ebe0 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
2ebf0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2ec00 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
2ec10 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
2ec20 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
2ec30 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
2ec40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
2ec50 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
2ec60 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2ec70 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2ec80 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
2ec90 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
2eca0 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
2ecb0 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
2ecd0 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
2ece0 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
2ecf0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
2ed00 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
2ed10 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
2ed20 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
2ed30 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20  ol = nGroupBy;. 
2ed40 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2ed50 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
2ed60 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2ed70 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2ed80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
2ed90 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
2eda0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
2edb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
2edc0 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
2edd0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2ede0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2edf0 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
2ee00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2ee10 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
2ee20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ee30 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2ee40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2ee50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2ee60 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2ee70 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
2ee80 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ase, 0, 0);.    
2ee90 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2eea0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2eeb0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2eec0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2eed0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2eee0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
2eef0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
2ef00 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
2ef10 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2ef20 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2ef30 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
2ef40 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
2ef50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ef60 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
2ef70 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c  umnToReg(pParse,
2ef80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efa0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
2efb0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
2efc0 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20  ->iTable, r1);. 
2efd0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2efe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2eff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2f000 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
2f010 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2f020 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2f030 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f040 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2f050 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
2f060 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2f070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f080 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2f090 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
2f0a0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
2f0b0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2f0c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2f0d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2f0e0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2f0f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2f100 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2f110 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
2f120 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2f130 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2f140 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
2f150 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2f160 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
2f170 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2f180 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
2f190 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
2f1a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2f1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f1c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2f1d0 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
2f1e0 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
2f1f0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2f200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f210 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
2f220 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2f230 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
2f240 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2f250 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
2f260 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65  BY sort")); Vdbe
2f270 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2f280 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
2f290 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
2f2a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f2b0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2f2c0 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d  Parse);..      }
2f2d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2f2e0 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f  e index or tempo
2f2f0 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20  rary table used 
2f300 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  by the GROUP BY 
2f310 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  sort.      ** wi
2f320 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c  ll naturally del
2f330 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65  iver rows in the
2f340 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20   order required 
2f350 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  by the ORDER BY.
2f360 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c        ** clause,
2f370 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65   cancel the ephe
2f380 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e  meral table open
2f390 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a   coded earlier..
2f3a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f3b0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
2f3c0 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
2f3d0 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
2f3e0 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
2f3f0 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  ardless..      *
2f400 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
2f410 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
2f420 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
2f430 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
2f440 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64  R to .      ** d
2f450 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
2f460 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
2f470 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
2f480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64  */.      if( ord
2f490 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d  erByGrp && Optim
2f4a0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2f4b0 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  b, SQLITE_GroupB
2f4c0 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20  yOrder) .       
2f4d0 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20  && (groupBySort 
2f4e0 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  || sqlite3WhereI
2f4f0 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29  sSorted(pWInfo))
2f500 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2f510 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2f520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
2f530 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2f540 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2f550 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2f560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2f570 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
2f580 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2f590 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
2f5a0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
2f5b0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
2f5c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2f5d0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
2f5e0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
2f5f0 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
2f600 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
2f610 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2f620 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
2f630 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
2f640 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
2f650 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
2f660 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
2f670 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
2f680 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
2f690 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
2f6a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2f6b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2f6c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2f6d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2f6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
2f6f0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2f700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f710 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
2f720 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
2f730 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
2f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f750 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73        sortOut, s
2f760 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20  ortPTab);.      
2f770 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2f780 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2f790 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2f7a0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2f7b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2f7c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2f7d0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2f7e0 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2f7f0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
2f800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2f810 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2f820 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2f830 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f840 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2f850 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2f860 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2f870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f890 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2f8a0 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2f8b0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2f8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2f8e0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2f8f0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2f900 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2f910 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
2f920 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f930 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2f940 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f950 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b   OP_Jump, addr1+
2f960 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20  1, 0, addr1+1); 
2f970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f980 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2f990 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
2f9a0 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
2f9b0 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
2f9c0 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
2f9d0 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
2f9e0 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
2f9f0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2fa00 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
2fa10 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
2fa20 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
2fa30 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
2fa40 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
2fa50 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
2fa60 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
2fa70 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
2fa80 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
2fa90 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
2faa0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
2fab0 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
2fac0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2fad0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
2fae0 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
2faf0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
2fb00 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
2fb10 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
2fb20 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
2fb30 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
2fb40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fb50 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
2fb60 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
2fb70 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
2fb80 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      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 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2fbb0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2fbc0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2fbd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fbe0 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
2fbf0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
2fc00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fc10 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
2fc20 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
2fc30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2fc40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fc50 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
2fc60 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2fc70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fc80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2fc90 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2fca0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
2fcb0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fcc0 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
2fcd0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2fce0 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
2fcf0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2fd00 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
2fd10 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
2fd20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
2fd30 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
2fd40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2fd50 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
2fd60 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2fd70 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2fd80 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2fd90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fda0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2fdb0 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2fdc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2fdd0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2fde0 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2fdf0 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2fe00 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2fe10 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2fe20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2fe30 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2fe40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fe50 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2fe60 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2fe70 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2fe80 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
2fe90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2fea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2feb0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2fec0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2fed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fee0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2fef0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2ff00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ff10 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2ff20 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2ff30 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
2ff40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ff50 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2ff60 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2ff70 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2ff80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ff90 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2ffa0 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2ffb0 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2ffc0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2ffd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2ffe0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2fff0 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20   addrEnd);..    
30000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
30010 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
30020 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
30030 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
30040 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
30050 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
30060 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
30070 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
30080 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
30090 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
300a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
300b0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
300c0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
300d0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
300e0 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
300f0 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
30100 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
30110 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
30120 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
30130 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
30140 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
30150 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
30160 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
30170 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
30180 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
30190 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
301a0 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
301b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
301c0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
301d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
301e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
301f0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
30200 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30210 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66  (v, "set abort f
30220 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
30230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
30240 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
30250 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
30260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30270 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
30280 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
30290 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
302a0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
302b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
302c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
302d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
302e0 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
302f0 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
30300 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
30310 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
30320 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
30330 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
30340 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
30350 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
30360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
30370 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
30380 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
30390 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
303a0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
303b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
303c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
303d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
303e0 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
303f0 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
30400 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
30410 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
30420 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
30430 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
30440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30450 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e          &sDistin
30460 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30480 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
30490 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
304a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
304b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
304c0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
304d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
304e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
304f0 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
30500 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
30510 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
30520 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
30530 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
30540 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
30550 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
30560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30570 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30580 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
30590 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
305a0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
305b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
305c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
305d0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
305e0 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
305f0 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
30600 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
30610 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
30620 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
30630 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
30640 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
30650 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  *pDel = 0;.#ifnd
30660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
30670 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
30680 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
30690 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
306a0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
306b0 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
306c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
306d0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
306e0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
306f0 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
30700 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
30710 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
30720 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
30730 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
30740 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30750 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
30760 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
30770 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30780 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
30790 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
307a0 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
307b0 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
307c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
307d0 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
307e0 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
307f0 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
30800 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
30810 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
30820 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
30830 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
30840 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
30850 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
30860 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
30870 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
30880 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
30890 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
308a0 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
308b0 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
308c0 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
308d0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
308e0 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
308f0 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
30900 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
30910 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
30920 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
30930 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
30940 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30950 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
30960 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
30970 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
30980 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
30990 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
309a0 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
309b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
309c0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
309d0 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
309e0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
309f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
30a10 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
30a20 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
30a30 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
30a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30a50 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
30a60 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
30a70 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
30a80 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
30a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
30aa0 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
30ab0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
30ac0 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
30ad0 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
30ae0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
30af0 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
30b00 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
30b10 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
30b20 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
30b30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
30b40 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
30b50 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
30b60 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
30b70 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
30b80 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
30b90 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
30ba0 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20   has the lowest 
30bb0 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20  scan cost..     
30bc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30bd0 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
30be0 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
30bf0 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
30c00 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
30c10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30c20 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f   (2013-10-03) Do
30c30 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65   not count the e
30c40 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74  ntries in a part
30c50 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ial index..     
30c60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30c70 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
30c80 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
30c90 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
30ca0 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
30cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
30cc0 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
30cd0 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
30ce0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30cf0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
30d00 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73  Tab) ) pBest = s
30d10 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
30d20 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
30d30 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
30d40 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
30d50 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
30d60 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
30d70 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65  f( pIdx->bUnorde
30d80 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
30d90 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78    && pIdx->szIdx
30da0 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
30db0 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ow.           &&
30dc0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
30dd0 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
30de0 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
30df0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
30e00 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29  pBest->szIdxRow)
30e10 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
30e20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
30e30 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
30e40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30e50 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
30e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
30e70 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
30e80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
30e90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
30ea0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
30eb0 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
30ec0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
30ed0 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
30ee0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
30ef0 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
30f00 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
30f10 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
30f20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
30f30 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Int(v, OP_OpenRe
30f40 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
30f50 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
30f60 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
30f70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30f80 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
30f90 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
30fa0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
30fb0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NFO);.        }.
30fc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30fd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
30fe0 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
30ff0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
31000 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
31010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
31020 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
31030 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
31040 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
31050 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
31060 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
31070 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31080 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
31090 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
310a0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
310b0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
310c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
310d0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
310e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
310f0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
31100 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
31110 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
31120 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
31130 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31140 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
31150 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
31160 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
31170 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
31180 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20  results.        
31190 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
311a0 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
311b0 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
311c0 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
311d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77  .        ** If w
311e0 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74  here.c is able t
311f0 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74  o produce result
31200 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73  s sorted in this
31210 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20   order, then.   
31220 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
31230 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
31240 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
31250 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
31260 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
31270 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
31280 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
31290 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
312a0 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
312b0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
312c0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
312d0 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
312e0 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
312f0 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  um .        ** v
31300 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
31310 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
31320 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
31330 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
31340 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
31350 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
31360 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
31370 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
31380 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
31390 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  vior as follows:
313a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
313b0 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
313c0 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
313d0 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
313e0 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
313f0 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
31400 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
31410 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
31420 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
31430 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
31440 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31450 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
31460 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
31470 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
31480 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
31490 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
314a0 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
314b0 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
314c0 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
314d0 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
314e0 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
314f0 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
31500 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
31510 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
31520 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
31530 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
31540 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
31550 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
31560 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
31570 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
31580 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
31590 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
315a0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
315b0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
315c0 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
315d0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
315e0 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73      .        ass
315f0 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
31600 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
31610 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29  ssert( flag==0 )
31620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
31630 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20  >pHaving==0 ){. 
31640 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
31650 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67  minMaxQuery(&sAg
31660 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29  gInfo, &pMinMax)
31670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31680 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
31690 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21  ==0 || (pMinMax!
316a0 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 && pMinMax->n
316b0 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20  Expr==1) );..   
316c0 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
316d0 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
316e0 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
316f0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e  ListDup(db, pMin
31700 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Max, 0);.       
31710 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
31720 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
31730 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
31740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
31750 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
31760 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
31770 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
31780 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
31790 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
317a0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
317b0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
317c0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
317d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
317e0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
317f0 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
31800 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
31810 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31820 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
31830 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
31840 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
31850 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
31860 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
31870 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
31880 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
31890 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
318a0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
318b0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
318c0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
318d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
318e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
318f0 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
31900 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20  ,0,flag,0);.    
31910 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
31920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
31930 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
31940 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
31950 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
31960 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
31970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
31980 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
31990 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
319a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
319b0 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
319c0 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
319d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
319e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
319f0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e  Ordered(pWInfo)>
31a00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
31a10 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
31a20 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
31a30 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
31a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
31a50 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
31a60 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
31a80 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
31a90 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
31aa0 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
31ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31ac0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
31ad0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
31ae0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
31af0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
31b00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31b10 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
31b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
31b30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
31b40 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
31b50 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
31b60 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
31b70 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
31b80 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
31b90 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
31ba0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
31bb0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
31bc0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
31bd0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
31be0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31bf0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
31c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31c10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
31c20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
31c30 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
31c40 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
31c50 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
31c60 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
31c70 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
31c80 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
31c90 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
31ca0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
31cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
31cc0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
31cd0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
31ce0 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
31cf0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
31d00 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
31d10 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
31d20 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
31d30 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
31d40 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
31d50 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
31d60 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
31d70 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
31d80 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
31d90 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
31da0 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
31db0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
31dc0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
31dd0 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
31de0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
31df0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
31e00 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
31e10 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
31e20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31e30 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
31e40 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
31e50 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e   has been coded.
31e60 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
31e70 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
31e80 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20  se structure,.  
31e90 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72  ** set the retur
31ea0 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68  n code to 1. Oth
31eb0 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72  erwise 0. */.  r
31ec0 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  c = (pParse->nEr
31ed0 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74  r>0);..  /* Cont
31ee0 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
31ef0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
31f00 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
31f10 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
31f20 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
31f30 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
31f40 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
31f50 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
31f60 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
31f70 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
31f80 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
31f90 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
31fa0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
31fb0 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
31fc0 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
31fd0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
31fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31ff0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32000 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
32010 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
32020 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
32030 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
32040 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
32050 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
32060 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
32070 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
32080 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
32090 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
320a0 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
320b0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
320c0 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
320d0 22 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  "));.  pParse->n
320e0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
320f0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32100 72 63 3b 0a 7d 0a                                rc;.}.