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

Artifact ecd8562e686b968511abbad6d6810fa30fda2952:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74  ral */.  u8 sort
07c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f  Flags;         /
07d0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
07e0: 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a  ORTFLAG_* bits *
07f0: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52  /.};.#define SOR
0800: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
0810: 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53   0x01   /* Use S
0820: 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61  orterOpen instea
0830: 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72  d of OpenEphemer
0840: 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  al */../*.** Del
0850: 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74  ete all the cont
0860: 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20  ent of a Select 
0870: 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c  structure.  Deal
0880: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63  locate the struc
0890: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f  ture.** itself o
08a0: 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20  nly if bFree is 
08b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
08c0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72  lect *p, int bFr
08f0: 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  ee){.  while( p 
0900: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
0910: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
0920: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
0930: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0940: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
0950: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
0970: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  c);.    sqlite3E
0980: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
09a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
09b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ete(db, p->pGrou
09c0: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
09d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
09e0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
09f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0a00: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
0a10: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
0a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0a30: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
0a40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a50: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
0a60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
0a70: 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20  3WithDelete(db, 
0a80: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69  p->pWith);.    i
0a90: 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74  f( bFree ) sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0ab0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ac0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0ae0: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0af0: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0b10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0b20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0b30: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0b40: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0b50: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0b60: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0b70: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0b80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
0b90: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0ba0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0bb0: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0bc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0bd0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0be0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0c00: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0c10: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0c20: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0c60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0c70: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0c80: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0c90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0ca0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0cb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0cc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0cd0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0ce0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0cf0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0d00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0d10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0d20: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0d30: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0d40: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0d50: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0d60: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0d90: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0db0: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0dc0: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0dd0: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0de0: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0df0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0e00: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0e10: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0e20: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0e30: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0e40: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0e50: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0e60: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0e70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0e80: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0e90: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0ea0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0ec0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0ed0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0ee0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0f00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f10: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0f20: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
0f30: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
0f40: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
0f50: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f60: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0f80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0f90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fa0: 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a  TK_ALL,0));.  }.
0fb0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0fc0: 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70   pEList;.  if( p
0fd0: 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20  Src==0 ) pSrc = 
0fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0ff0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
1000: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
1010: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
1020: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1030: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1040: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1050: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1060: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1070: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1080: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1090: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
10a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
10b0: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
10c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
10d0: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
10e0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  et;.  assert( pO
1100: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
1110: 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  it!=0 || pParse-
1120: 3e 6e 45 72 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d  >nErr>0 || db->m
1130: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1150: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
1160: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1170: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
1180: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1190: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
11a0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
11b0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
11c0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
11d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11e0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
11f0: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1200: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1210: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1220: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1230: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1240: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1250: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1260: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
1270: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
1280: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
1290: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
12a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
12c0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
12d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12e0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
12f0: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1300: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1310: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1320: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1330: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1340: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1350: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1360: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1370: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
1390: 65 63 74 20 2a 70 29 7b 0a 20 20 63 6c 65 61 72  ect *p){.  clear
13a0: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
13b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13d0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
13e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
13f0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
1400: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
1410: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
1420: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
1430: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1440: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1450: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1460: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1470: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1480: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1490: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
14a0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
14b0: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
14c0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
14d0: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
14e0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
14f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
1500: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
1510: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
1520: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
1530: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1540: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1550: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1560: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1570: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1580: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1590: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
15a0: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
15b0: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
15c0: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
15d0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
15e0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
15f0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1600: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1610: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1620: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1640: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1650: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1660: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1670: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1680: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1690: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
16a0: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
16b0: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1700: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1710: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1720: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1730: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1740: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1750: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1760: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1770: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1780: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1790: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
17a0: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
17b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
17c0: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
17d0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
17e0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
17f0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1800: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1810: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1820: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1830: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1840: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1850: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1860: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1870: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1880: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1890: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
18a0: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
18b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
18c0: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
18d0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
18e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
18f0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1900: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1910: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1920: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1930: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1940: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1960: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1970: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1980: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1990: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
19a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
19b0: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
19c0: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
19d0: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
19e0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
19f0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1a00: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1a10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a20: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1a30: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1a40: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1a50: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1a60: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1a70: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1a80: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1a90: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1aa0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1ab0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ac0: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1ad0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1ae0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1b00: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1b10: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1b20: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1b30: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
1b40: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
1b50: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
1b60: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1b70: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1b90: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1ba0: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1bb0: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1bc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1bd0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1be0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1bf0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c00: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
1c10: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
1c20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
1c30: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
1c40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c50: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1c60: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
1c70: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
1c80: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
1c90: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
1ca0: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
1cb0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1cc0: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
1cd0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
1cf0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1d00: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
1d10: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
1d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d30: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
1d40: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1d50: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1d60: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1d70: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1d80: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1da0: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1db0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1dc0: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1dd0: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1de0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
1df0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
1e00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
1e10: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1e20: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
1e30: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
1e40: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1e50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1e60: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1e90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1ea0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1eb0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1ed0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
1ee0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
1ef0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
1f00: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
1f10: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
1f20: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
1f30: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
1f40: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
1f50: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
1f60: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
1f70: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
1f80: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
1f90: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
1fa0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
1fb0: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
1fc0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
1fd0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
1fe0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
1ff0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
2000: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
2010: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2020: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
2030: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2050: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2060: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2070: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2080: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
20a0: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
20b0: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
20c0: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
20d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
20e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
20f0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
2100: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
2110: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
2120: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
2130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2140: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2160: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2170: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2180: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21a0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
21b0: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
21c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
21d0: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
21e0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
21f0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
2200: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
2210: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
2220: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
2230: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2240: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2250: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2260: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2270: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2280: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2290: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
22a0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22e0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
22f0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
2300: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
2310: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2320: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
2330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2340: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2350: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2360: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2370: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2380: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2390: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
23a0: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
23b0: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
23c0: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
23d0: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
23e0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
23f0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
2400: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
2410: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
2420: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
2430: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2440: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2450: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2470: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
24c0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
24d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
24e0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
24f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2500: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2520: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
2530: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2540: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2550: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2560: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2580: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2590: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
25c0: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
25e0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2610: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2620: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2650: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2660: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2670: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2680: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
26b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
26d0: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
26e0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
26f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2700: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2710: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2720: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2730: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2740: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2750: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2760: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2770: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2780: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2790: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
27a0: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
27b0: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
27c0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27d0: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
27e0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
27f0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2800: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2810: 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69  E1, pE2, 0);.  i
2820: 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65  f( pEq && isOute
2830: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
2840: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71  rSetProperty(pEq
2850: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2860: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2870: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 71  rHasProperty(pEq
2880: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2890: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
28a0: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
28b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52  erty(pEq, EP_NoR
28c0: 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d  educe);.    pEq-
28d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
28e0: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
28f0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2900: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2910: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2920: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2930: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2940: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2950: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2960: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2970: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2980: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2990: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
29a0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
29b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
29c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
29d0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
29e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
29f0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2a00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2a10: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2a20: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2a30: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2a40: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2a50: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2a60: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2a70: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2a80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2a90: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2aa0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2ab0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2ac0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2ad0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2ae0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2af0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2b00: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2b10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2b20: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2b30: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2b40: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b50: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2b60: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2b70: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
2b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2b90: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
2ba0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2bb0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
2bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
2bd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2be0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2bf0: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2c00: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2c10: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2c20: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2c30: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2c40: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2c50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c60: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2c70: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
2c80: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
2c90: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2ca0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
2cb0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2cc0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
2cd0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2ce0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2cf0: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2d00: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2d10: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2d20: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2d30: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2d40: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2d50: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2d60: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2d70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
2d80: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
2d90: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
2da0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
2db0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
2dc0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
2dd0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2de0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2df0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2e00: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2e10: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2e20: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2e30: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2e70: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2e80: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2e90: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2ea0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
2eb0: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
2ec0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2ed0: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  6)iTable;.    se
2ee0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2ef0: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2f00: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2f10: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2f30: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2f40: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2f50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2f60: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2f70: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2f80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2f90: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2fa0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2fb0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2fc0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2fe0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2ff0: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
3000: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
3010: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
3020: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
3030: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
3040: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
3050: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
3060: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
3070: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3080: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3090: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
30a0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
30b0: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
30c0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
30d0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
30e0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
30f0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
3100: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
3110: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
3120: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
3130: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
3140: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
3150: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
3160: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
3170: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3190: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
31a0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
31b0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
31c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
31d0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
31e0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
31f0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3200: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3210: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
3220: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
3230: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
3240: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3260: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
3270: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3280: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3290: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
32a0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
32b0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32c0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
32d0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
32e0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
32f0: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3300: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3310: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
3320: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
3330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
3340: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
3350: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
3360: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
3370: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
3380: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
3390: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
33a0: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
33b0: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
33c0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
33d0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
33e0: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
33f0: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3400: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69  r = (pRight->joi
3410: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3420: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3430: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3440: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3450: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3460: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3470: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3480: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3490: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
34a0: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
34b0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
34c0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
34d0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
34e0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
34f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3510: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3520: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3530: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3540: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3550: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3560: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3580: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3590: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
35a0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
35b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
35c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
35d0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
35e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
35f0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3600: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3610: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3620: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3630: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3640: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3650: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3660: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3670: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3680: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3690: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
36a0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
36b0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
36c0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
36d0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
36e0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
36f0: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3700: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3730: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3750: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3760: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3770: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3780: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3790: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
37a0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
37b0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
37c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
37d0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
37e0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
37f0: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
3800: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
3810: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
3820: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
3840: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
3850: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
3860: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
3870: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
3880: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
3890: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
38a0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
38b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
38c0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
38d0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
38e0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
38f0: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
3900: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
3910: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
3920: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
3930: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
3940: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
3950: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
3960: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
3970: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3980: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
3990: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
39a0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
39b0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
39c0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
39d0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
39e0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
39f0: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
3a00: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
3a10: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
3a20: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
3a30: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
3a40: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
3a50: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
3a60: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
3a70: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
3a80: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
3a90: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
3aa0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
3ab0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
3ac0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
3ad0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
3ae0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3af0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3b00: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
3b10: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
3b20: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
3b30: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
3b40: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
3b50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3b60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b70: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
3b80: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
3b90: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3ba0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
3bb0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
3bc0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3bd0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
3be0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
3bf0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3c00: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3c10: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
3c20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c30: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
3c40: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c50: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c60: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
3c70: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
3c80: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
3c90: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
3ca0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
3cb0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
3cc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
3cd0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
3ce0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
3cf0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3d00: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3d10: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3d20: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
3d30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3d50: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
3d60: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
3d70: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
3d80: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
3d90: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
3da0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
3db0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3dd0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3de0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3df0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3e00: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3e30: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3e40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3e50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
3e60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3e70: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
3e80: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
3e90: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
3ea0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3eb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3ec0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3ed0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
3ee0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
3ef0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
3f00: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
3f10: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
3f20: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
3f30: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
3f40: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
3f50: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
3f60: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
3f70: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
3f80: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b  to the end */.);
3f90: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3fa0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3fb0: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
3fc0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
3fd0: 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20  Data.** through 
3fe0: 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20  regData+nData-1 
3ff0: 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  onto the sorter.
4000: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4010: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
4020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4040: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4050: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
4060: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
4070: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
4080: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4090: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
40a0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
40b0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
40c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
40d0: 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20  nt regData,     
40e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
40f0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
4100: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
4110: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  d */.  int nData
4120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4130: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4140: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  nts in the data 
4150: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4160: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4170: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4180: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4190: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
41a0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
41b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
41c0: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
41e0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
41f0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
4200: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
4210: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
4220: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
4230: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
4240: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
4250: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
4260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4270: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
4280: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
4290: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
42a0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
42b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
42c0: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
42d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
42e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
4310: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
4320: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
4330: 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
4340: 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
4350: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
4360: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
4370: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
4380: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
4390: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
43b0: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
43c0: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
43f0: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
4400: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
4410: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
4420: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
4430: 71 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  q==1 );.  if( nP
4440: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4450: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4460: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4470: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4480: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4490: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
44a0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
44b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
44c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
44d0: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
44e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
44f0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4500: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4510: 79 2c 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49  y, regBase, SQLI
4520: 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
4530: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
4540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4550: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
4560: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4570: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
4580: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
4590: 65 66 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20  efixReg==0 ){.  
45a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
45b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
45c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
45d0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
45e0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
45f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4600: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4610: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4620: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4630: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4640: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4650: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4660: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4670: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4680: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4690: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
46a0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
46b0: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
46c0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
46d0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
46e0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
46f0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4700: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4710: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4720: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4730: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4740: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4750: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4760: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4770: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4780: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4790: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
47a0: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
47b0: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
47c0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
47d0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
47e0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
47f0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4800: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4810: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4820: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4830: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4840: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4850: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4860: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4870: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4880: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4890: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
48a0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
48b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
48c0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
48d0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
48e0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
48f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4900: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4910: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4920: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4930: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4940: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4950: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4960: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4970: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4980: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4990: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
49a0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
49b0: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
49c0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
49d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
49e0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
49f0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4a00: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
4a10: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4a20: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4a30: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4a50: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4a60: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4a70: 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e   testcase( pKI->
4a80: 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20 20  nXField>2 );.   
4a90: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4aa0: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4ab0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4ac0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4ad0: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64      pKI->nXField
4b10: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4b20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4b30: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4b40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4b50: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4b60: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4b70: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4b80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4b90: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4ba0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4bb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4bc0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4bd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4be0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
4bf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
4c00: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
4c10: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
4c20: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
4c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c40: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
4c50: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
4c60: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4c70: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4c80: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
4c90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4ca0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4cb0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
4cc0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4cf0: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
4d00: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
4d10: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4d20: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
4d30: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
4d40: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
4d50: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
4d60: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
4d70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4d80: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
4d90: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
4da0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
4db0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
4dc0: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
4dd0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4de0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4df0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4e00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4e10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
4e20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4e30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
4e50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4e60: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
4e70: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 30 2c  Zero, iLimit, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4eb0: 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e  OP_Last, pSort->
4ec0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4ee0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
4ef0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4f20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f30: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
4f40: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
4f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4f60: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
4f70: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4f80: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4f90: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
4fa0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
4fb0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
4fc0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
4fd0: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
4fe0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
4ff0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5000: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
5010: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
5020: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
5030: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
5040: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5060: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66 66  , OP_IfNeg, iOff
5070: 73 65 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62  set, 0, -1); Vdb
5080: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
50a0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
50b0: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
50c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
50d0: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
50e0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
50f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5100: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5110: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5120: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
5130: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
5140: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
5150: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
5160: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
5170: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
5180: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
5190: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
51a0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
51b0: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
51c0: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
51d0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
51e0: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
51f0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
5200: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
5210: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
5220: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
5230: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
5240: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
5250: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
5260: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
5270: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
5280: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
5290: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
52a0: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
52b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
52c0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
52d0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
52e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
52f0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
5300: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
5310: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
5320: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
5330: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
5340: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
5350: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
5360: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
5370: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
5380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
5390: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
53a0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
53b0: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
53c0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
53d0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
53e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
53f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5400: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5410: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5420: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
5430: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
5440: 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b  epeat, iMem, N);
5450: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5460: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5470: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5480: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
5490: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
54a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
54b0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
54c0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
54d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
54e0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
54f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5500: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
5510: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
5520: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
5530: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
5540: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
5550: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
5560: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
5570: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
5580: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
5590: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
55a0: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
55b0: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
55c0: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
55d0: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
55e0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
55f0: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
5600: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
5610: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
5620: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
5630: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
5640: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
5650: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
5660: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
5670: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
5680: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
5690: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
56a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
56b0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
56c0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
56d0: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
56e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
56f0: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
5700: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
5710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5720: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5730: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
5740: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
5750: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5760: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
5770: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
5780: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
5790: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
57a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
57b0: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
57c0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
57d0: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
57e0: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
57f0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5800: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
5810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
5820: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5830: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5850: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5860: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
5870: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
5880: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
5890: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
58a0: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
58b0: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ive, then the pE
58c0: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
58d0: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
58e0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
58f0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
5900: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
5910: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
5920: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
5930: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
5940: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
5950: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5960: 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65  .** to get numbe
5970: 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  r columns and th
5980: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65  e datatype for e
5990: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
59a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
59b0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
59c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
59d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
59e0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
59f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
5a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5a10: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
5a20: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
5a30: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
5a40: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
5a50: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
5a60: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
5a70: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
5a80: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
5a90: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
5aa0: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
5ab0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
5ac0: 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt,         /* I
5ad0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
5ae0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
5af0: 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  ss ORDER BY */. 
5b00: 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44   DistinctCtx *pD
5b10: 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e  istinct, /* If n
5b20: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5b30: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5b40: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65  DISTINCT */.  Se
5b50: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
5b60: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
5b70: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
5b80: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5b90: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
5ba0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5bb0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
5bc0: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
5bd0: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
5be0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5bf0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
5c00: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
5c10: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  oop */.){.  Vdbe
5c20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5c30: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5c40: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
5c50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5c60: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
5c70: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
5c80: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
5c90: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
5ca0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
5cb0: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
5cc0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
5cd0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
5ce0: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
5cf0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
5d00: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5d10: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
5d20: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
5d40: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
5d50: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
5d60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
5d70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
5d80: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
5d90: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
5da0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
5db0: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
5dc0: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
5dd0: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
5de0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5df0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5e00: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5e10: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5e20: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5e30: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
5e40: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
5e50: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
5e60: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
5e70: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
5e80: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
5e90: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5ea0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
5eb0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
5ec0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5ed0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5ee0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
5ef0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
5f00: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
5f10: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
5f20: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
5f30: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
5f40: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
5f50: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
5f60: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
5f70: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
5f80: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
5f90: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
5fa0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
5fb0: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
5fc0: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
5fd0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
5fe0: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
5ff0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
6000: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6010: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6020: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
6040: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
6050: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
6060: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
6070: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
6080: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
6090: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
60a0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
60b0: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
60c0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
60d0: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
60e0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
60f0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
6100: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
6110: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
6120: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
6130: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
6140: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
6150: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
6160: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
6170: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6180: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
6190: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
61a0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
61b0: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
61c0: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
61d0: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
61e0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
61f0: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
6200: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
6210: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65  sultCol;.  regRe
6220: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6230: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
6240: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
6250: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
6260: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6280: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
6290: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
62a0: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
62b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
62c0: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
62d0: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
62e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
62f0: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6300: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6310: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6320: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6330: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6340: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6350: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
6360: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
6370: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
6380: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
6390: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
63a0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
63b0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
63c0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
63d0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
63e0: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
63f0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6410: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6420: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
6430: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6440: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
6450: 72 65 67 52 65 73 75 6c 74 2c 20 65 63 65 6c 46  regResult, ecelF
6460: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6470: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6480: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6490: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
64a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
64b0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
64c0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
64d0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
64e0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
64f0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6500: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
6510: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
6520: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
6530: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6540: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
6550: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
6560: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6570: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6590: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
65a0: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
65b0: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
65c0: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
65d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
65e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
65f0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6600: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
6610: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
6620: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
6630: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
6640: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
6650: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
6660: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
6670: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6680: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6690: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
66a0: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
66b0: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
66c0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
66d0: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
66e0: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
66f0: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6700: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
6710: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
6720: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
6730: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
6740: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
6750: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
6760: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
6770: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
6780: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
6790: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
67a0: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
67b0: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
67c0: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
67d0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
67e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
67f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6800: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6810: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6830: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6840: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6850: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
6860: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
6870: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
6880: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
6890: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
68a0: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
68b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
68c0: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
68d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
68e0: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
68f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6900: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6910: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6920: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6930: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6940: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6950: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6960: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6980: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6990: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
69a0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
69b0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
69c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
69d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
69e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
69f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6a00: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6a10: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6a20: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6a30: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6a40: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6a50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6a60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6a70: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6a80: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6a90: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6aa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6ab0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6ac0: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6ad0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6ae0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6af0: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6b00: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6b10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6b20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6b30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6b40: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6b50: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6b60: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6b80: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6b90: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6ba0: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6bb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6bc0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6bd0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6be0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6bf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6c00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6c10: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6c20: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6c30: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6c40: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6c50: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6c60: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6c70: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6c80: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6c90: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6ca0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6cb0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6cc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6cd0: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6cf0: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6d00: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6d20: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6d30: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6d40: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6d50: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6d60: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
6d70: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
6d80: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
6d90: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6da0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6db0: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
6dc0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
6dd0: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
6de0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
6df0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6e10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6e20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6e30: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
6e40: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
6e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6e60: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6e70: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
6e80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6e90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ea0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
6eb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
6ec0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
6ed0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
6ee0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
6ef0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
6f00: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
6f10: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
6f20: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
6f30: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
6f40: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
6f50: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
6f60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6f70: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
6f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f90: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
6fa0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
6fb0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6fc0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
6fd0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
6fe0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
6ff0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7000: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7010: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7020: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7030: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7040: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7050: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7060: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7070: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7080: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7090: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
70a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
70b0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
70c0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
70d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
70e0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
70f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7100: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7110: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7120: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7130: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7140: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7150: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
71a0: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
71b0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
71c0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
71d0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
71e0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
71f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7200: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7210: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7220: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7230: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7240: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7250: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7260: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7270: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7280: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7290: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
72a0: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
72b0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
72c0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
72d0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
72e0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
72f0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7300: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7310: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7320: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7330: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7340: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7350: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7360: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7370: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7380: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7390: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
73a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
73b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
73d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
73e0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
73f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7400: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7410: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7420: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7440: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7450: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
7460: 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c 20  +nPrefixReg, 1, 
7470: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7490: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
74a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
74b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
74c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
74d0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
74e0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
74f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7500: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7510: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7520: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7530: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7540: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7550: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7560: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7570: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7580: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7590: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
75a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
75b0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
75c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
75e0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
75f0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
7600: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
7610: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
7620: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
7630: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
7640: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
7650: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
7660: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
7670: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
7680: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
7690: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
76a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
76b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
76c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
76d0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
76e0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
76f0: 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20  st->affSdst =.  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
7720: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
7730: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
7740: 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
7750: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7760: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
7770: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
7780: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
7790: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
77a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
77b0: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
77c0: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
77d0: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
77e0: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
77f0: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
7800: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
7810: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
7820: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
7830: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
7840: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
7850: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
7860: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7870: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7880: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
7890: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
78a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
78b0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
78c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
78d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
78e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
78f0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
7900: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7910: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
7920: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
7930: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
7940: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
7950: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
7960: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
7970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7980: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
7990: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
79a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
79b0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
79c0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
79d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
79e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
79f0: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
7a00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7a10: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
7a20: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
7a30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7a40: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
7a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7a70: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
7a80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7a90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
7aa0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
7ab0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
7ac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7ad0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7ae0: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
7af0: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
7b00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
7b10: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
7b20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
7b30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7b40: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
7b50: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
7b60: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
7b70: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
7b80: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
7b90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7ba0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7bb0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7bc0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7bd0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7be0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7bf0: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7c00: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7c10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7c20: 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72   regResult==iPar
7c30: 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  m );.        /* 
7c40: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
7c50: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
7c60: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
7c70: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
7c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c90: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
7ca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7cb0: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63  BQUERY */..    c
7cc0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
7cd0: 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64  e:       /* Send
7ce0: 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f   data to a co-ro
7cf0: 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73  utine */.    cas
7d00: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20  e SRT_Output: { 
7d10: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7d20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
7d30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d40: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7d50: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
7d60: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7d70: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
7d80: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7d90: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7da0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7db0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7dc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7dd0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
7df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7e00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7e20: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
7e30: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
7e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e60: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7e70: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
7e80: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7e90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7ea0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7eb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7ec0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7ed0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
7ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7f00: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
7f10: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
7f20: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
7f30: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
7f40: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
7f50: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
7f60: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
7f70: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
7f80: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
7f90: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
7fa0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
7fb0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
7fc0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
7fd0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
7fe0: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
7ff0: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
8000: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
8010: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
8020: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8030: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8040: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8050: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8060: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8070: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8080: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8090: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
80a0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
80b0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
80c0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
80d0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
80e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
80f0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
8100: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
8110: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
8120: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8130: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8140: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8150: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8160: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8170: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8180: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8190: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
81a0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
81b0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
81c0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
81d0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
81e0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
81f0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8200: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
8210: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
8220: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8230: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8240: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8250: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8260: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8270: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8280: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8290: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
82a0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
82b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
82c0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
82d0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
82e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8310: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8320: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8330: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8340: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8350: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8360: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8370: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8380: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8390: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
83a0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
83b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
83d0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
83e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
83f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8400: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
8410: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
8420: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8430: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8450: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8460: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8490: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
84a0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
84d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
84e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
84f0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
8500: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
8510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8520: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8530: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8540: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8560: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8570: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8580: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8590: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
85a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
85b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
85c0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
85d0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
85e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
85f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8600: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
8610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8620: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8630: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8640: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8650: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8660: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8670: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8680: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8690: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
86a0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
86b0: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
86c0: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
86d0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
86e0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
86f0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
8700: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
8710: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
8720: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8730: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8740: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8750: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8760: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8770: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8780: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8790: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
87a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
87b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
87c0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
87d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
87e0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
87f0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8800: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8810: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8820: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8830: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8840: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8850: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8860: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8870: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8880: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8890: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
88a0: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
88b0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
88c0: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
88d0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
88e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
88f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8900: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8910: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8920: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8930: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8940: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8950: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8960: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8970: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
8980: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
8990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
89a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89b0: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
89c0: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
89d0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
89e0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
89f0: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
8a00: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
8a10: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
8a20: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
8a30: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
8a40: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
8a50: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
8a60: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
8a70: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
8a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8a90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8ac0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
8ad0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
8ae0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
8af0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8b00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8b10: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8b20: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
8b30: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
8b40: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
8b50: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
8b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
8b70: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
8b80: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8b90: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8ba0: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
8bb0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8bc0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8bd0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8be0: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
8bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8c00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8c10: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
8c20: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
8c30: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
8c40: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
8c50: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
8c60: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
8c70: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
8c80: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
8c90: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
8ca0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
8cb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8cc0: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
8cd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
8ce0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
8cf0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
8d00: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
8d10: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
8d20: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
8d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8d40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
8d50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
8d60: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
8d70: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8d80: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
8d90: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
8da0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
8db0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
8dc0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
8dd0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
8de0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
8df0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8e00: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
8e10: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
8e20: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
8e30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8e40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8e50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
8e60: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
8e70: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
8e80: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
8e90: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
8ea0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
8eb0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
8ec0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8ed0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
8ee0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
8ef0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
8f00: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
8f10: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
8f20: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
8f30: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
8f40: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
8f50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
8f60: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
8f70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8f80: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
8f90: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
8fa0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
8fb0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
8fc0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
8fd0: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
8fe0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
8ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9000: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9010: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9020: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
9030: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
9040: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
9050: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
9060: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
9070: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
9080: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
9090: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
90a0: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
90b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
90c0: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
90d0: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
90e0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
90f0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
9100: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
9110: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9120: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9140: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
9150: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
9160: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
9170: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
9180: 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20  , nExpr-iStart, 
9190: 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28  nExtra+1);.  if(
91a0: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
91b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
91c0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
91d0: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
91e0: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
91f0: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
9200: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
9210: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
9220: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9230: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
9240: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
9250: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
9260: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
9270: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
9280: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
9290: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
92a0: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
92b0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
92c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
92d0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
92e0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
92f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9300: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e  n pInfo;.}..#ifn
9310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9320: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
9330: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9350: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9360: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9370: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9380: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
9390: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
93a0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
93b0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
93c0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
93d0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
93e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
93f0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9400: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9420: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9430: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9450: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9460: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9480: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
9490: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
94a0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
94b0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
94c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
94d0: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
94e0: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
94f0: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9500: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9510: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9520: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9530: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9540: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9550: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
9560: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
9570: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
9580: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9590: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
95a0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
95b0: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
95c0: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
95d0: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
95e0: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
95f0: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
9600: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
9610: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
9620: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
9630: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
9640: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
9650: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9660: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
9670: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
9680: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
9690: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
96a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
96b0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
96c0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
96d0: 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42  >db, "USE TEMP B
96e0: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
96f0: 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  Usage);.    sqli
9700: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9710: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
9720: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
9730: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
9740: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
9750: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70  /*.** Assign exp
9760: 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61  ression b to lva
9770: 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c  lue a. A second,
9780: 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20   no-op, version 
9790: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a  of this macro.**
97a0: 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65   is provided whe
97b0: 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  n SQLITE_OMIT_EX
97c0: 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64  PLAIN is defined
97d0: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
97e0: 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c  e code.** in sql
97f0: 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20  ite3Select() to 
9800: 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f  assign values to
9810: 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65   structure membe
9820: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
9830: 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69  .** only exist i
9840: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9850: 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66  PLAIN is not def
9860: 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c  ined without pol
9870: 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  luting the.** co
9880: 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20  de with #ifndef 
9890: 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23  directives..*/.#
98a0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
98b0: 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20  etInteger(a, b) 
98c0: 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20  a = b..#else./* 
98d0: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
98e0: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
98f0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
9900: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
9910: 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70  fine explainTemp
9920: 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66  Table(y,z).# def
9930: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
9940: 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69  teger(y,z).#endi
9950: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9970: 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  AIN) && !defined
9980: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
9990: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a  POUND_SELECT)./*
99a0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
99b0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
99c0: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
99d0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
99e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
99f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9a00: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9a10: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9a20: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
9a30: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
9a40: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
9a50: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
9a60: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
9a70: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
9a80: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
9a90: 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a  d iSub2 (op)".**
9aa0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
9ab0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
9ac0: 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54  nd iSub2 USING T
9ad0: 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22  EMP B-TREE (op)"
9ae0: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75  .**.** where iSu
9af0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65  b1 and iSub2 are
9b00: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61   the integers pa
9b10: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72  ssed as the corr
9b20: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e  esponding.** fun
9b30: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ction parameters
9b40: 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20  , and op is the 
9b50: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
9b60: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ion of the param
9b70: 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73  eter.** of the s
9b80: 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61  ame name. The pa
9b90: 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73  rameter "op" mus
9ba0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  t be one of TK_U
9bb0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
9bc0: 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  .** TK_INTERSECT
9bd0: 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20   or TK_ALL. The 
9be0: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73  first form is us
9bf0: 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62  ed if argument b
9c00: 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61  UseTmp is .** fa
9c10: 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f  lse, or the seco
9c20: 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73  nd form if it is
9c30: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
9c40: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d   void explainCom
9c50: 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20  posite(.  Parse 
9c60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9c80: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
9c90: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  /* One of TK_UNI
9cc0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74  ON, TK_EXCEPT et
9cd0: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  c. */.  int iSub
9ce0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9d00: 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e  ery id 1 */.  in
9d10: 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20  t iSub2,        
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d30: 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a   Subquery id 2 *
9d40: 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20  /.  int bUseTmp 
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
9d70: 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20   temp table was 
9d80: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
9d90: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ert( op==TK_UNIO
9da0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45  N || op==TK_EXCE
9db0: 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
9dc0: 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  ERSECT || op==TK
9dd0: 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50  _ALL );.  if( pP
9de0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
9df0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
9e00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9e10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
9e20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9e30: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
9e40: 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  ->db, "COMPOUND 
9e50: 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e  SUBQUERIES %d AN
9e60: 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53  D %d %s(%s)", iS
9e70: 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20  ub1, iSub2,.    
9e80: 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49      bUseTmp?"USI
9e90: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22  NG TEMP B-TREE "
9ea0: 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  :"", selectOpNam
9eb0: 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20  e(op).    );.   
9ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ed0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9ee0: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9ef0: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
9f00: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
9f10: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d  }.}.#else./* No-
9f20: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
9f30: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
9f40: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
9f50: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
9f60: 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  e explainComposi
9f70: 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  te(v,w,x,y,z).#e
9f80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
9f90: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
9fa0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
9fb0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
9fc0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
9fd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
9fe0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
9ff0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
a000: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
a010: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
a020: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
a030: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
a040: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
a050: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
a060: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
a070: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
a080: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
a090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
a0a0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
a0b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a0c0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a0d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
a0e0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
a0f0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
a100: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74  tement */.  Sort
a110: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a  Ctx *pSort,   /*
a120: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   Information on 
a130: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
a140: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  use */.  int nCo
a150: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
a160: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a170: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
a180: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
a190: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
a1a0: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
a1b0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
a1c0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
a1f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
a200: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  /.  int addrBrea
a210: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
a220: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20  akeLabel(v);    
a230: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a240: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
a250: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
a260: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a270: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
a280: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
a290: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
a2a0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64  t addr;.  int ad
a2b0: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
a2c0: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
a2d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
a2e0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
a2f0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
a300: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
a310: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
a320: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
a330: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
a340: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b  gRowid;.  int nK
a350: 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54  ey;.  int iSortT
a360: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
a370: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
a380: 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66  cursor to read f
a390: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f  rom */.  int nSo
a3a0: 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  rtData;         
a3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69           /* Trai
a3c0: 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72  ling values to r
a3d0: 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20  ead from sorter 
a3e0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
a3f0: 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20  t bSeq;         
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a410: 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20   True if sorter 
a420: 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20  record includes 
a430: 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64  seq. no. */.#ifd
a440: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a450: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
a460: 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  S.  struct ExprL
a470: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
a480: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
a490: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
a4a0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a4b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a4c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a4d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
a4e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
a4f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a510: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
a520: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
a530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
a540: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
a550: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a560: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
a570: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
a580: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a590: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
a5a0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
a5b0: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a5c0: 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d   0;.    regRow =
a5d0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
a5e0: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e     nSortData = n
a5f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
a600: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
a610: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a620: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
a630: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
a640: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a650: 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  );.    nSortData
a660: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79   = 1;.  }.  nKey
a670: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
a680: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
a690: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
a6a0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
a6b0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
a6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
a6d0: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
a6e0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
a6f0: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
a700: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
a710: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a720: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
a730: 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ce = sqlite3Code
a740: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
a750: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a760: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a770: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a780: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
a790: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
a7a0: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
a7b0: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
a7c0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
a7d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a7e0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
a7f0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
a800: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a810: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
a820: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
a830: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a840: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a850: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a860: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a880: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
a890: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
a8a0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
a8b0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
a8c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a8d0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
a8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a8f0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
a900: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); 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 69  Continue);.    i
a950: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
a960: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
a970: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
a980: 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a  SortData; i++){.
a990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a9b0: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b  mn, iSortTab, nK
a9c0: 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f  ey+bSeq+i, regRo
a9d0: 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  w+i);.    VdbeCo
a9e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
a9f0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
aa00: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
aa10: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
aa20: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
aa30: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
aa40: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
aa50: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
aa60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa70: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
aa80: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
aa90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aaa0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
aab0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
aac0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
aad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aae0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
aaf0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
ab00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ab10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ab20: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
ab30: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
ab40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ab50: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
ab60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
ab80: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
ab90: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
abc0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
abd0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
abe0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
abf0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
ac00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ac20: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
ac30: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
ac40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
ac60: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
ac70: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ac80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ac90: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
aca0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
acb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
acc0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
acd0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
ace0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
acf0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
ad00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ad10: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
ad20: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
ad30: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
ad40: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ad50: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
ad60: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ad70: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ad80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ad90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
ada0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
adb0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
adc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
add0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ade0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
adf0: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ae00: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
ae10: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
ae20: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ae30: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
ae40: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ae50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae70: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ae80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ae90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aea0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
aeb0: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
aec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
aed0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
aee0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
aef0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
af00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
af10: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
af20: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
af30: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
af40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
af50: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
af60: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
af70: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
af80: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
af90: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
afa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
afb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
afc0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
afd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
afe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
aff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b000: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
b010: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
b020: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
b030: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
b040: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
b050: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
b060: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
b070: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
b080: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b090: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
b0a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
b0b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b0c0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
b0d0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
b0e0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
b0f0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
b100: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
b110: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
b120: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
b130: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
b140: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
b150: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
b160: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b170: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
b180: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
b190: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
b1a0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
b1b0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
b1c0: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
b1d0: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
b1e0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
b1f0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
b200: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
b210: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b220: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
b230: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
b240: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
b250: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
b260: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
b270: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
b280: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
b290: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
b2a0: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
b2b0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
b2c0: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
b2d0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
b2e0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
b2f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
b300: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
b310: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
b320: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
b330: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
b340: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
b350: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
b360: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
b370: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
b380: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
b390: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
b3a0: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
b3b0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
b3c0: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
b3d0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
b3e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b3f0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
b400: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
b410: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
b420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
b430: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
b440: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
b450: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
b460: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
b470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b480: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
b490: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
b4a0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
b4b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b4c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b4d0: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
b4e0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
b4f0: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
b500: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23  l(A,B,C,D,E,F).#
b510: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
b520: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b530: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b540: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
b550: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b560: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b570: 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e  eImpl(A,B,F).#en
b580: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
b590: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
b5a0: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
b5b0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
b5c0: 70 72 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65  pr *pExpr,.#ifde
b5d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b5e0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
b600: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
b610: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
b620: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b630: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e  **pzOrigCol,.#en
b640: 64 69 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69  dif.  u8 *pEstWi
b650: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
b660: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
b670: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
b680: 74 57 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64  tWidth = 1;.#ifd
b690: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b6a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b6b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b6c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
b6d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
b6e0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
b6f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
b700: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   0;.#endif..  if
b710: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
b720: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
b730: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
b740: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b750: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b760: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
b770: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
b780: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
b790: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
b7a0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
b7b0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
b7c0: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
b7d0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
b7e0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
b7f0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
b800: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
b810: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
b820: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
b830: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
b840: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
b850: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
b860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
b870: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
b880: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b890: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b8a0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b8c0: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
b8d0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
b8e0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
b8f0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
b900: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
b910: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
b920: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
b930: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b940: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b950: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b960: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b970: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b980: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
b990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
b9a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b9b0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
b9c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b9d0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
b9e0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
b9f0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
ba00: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
ba10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
ba20: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
ba30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
ba40: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ba50: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
ba60: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
ba70: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
ba80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba90: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
baa0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
bab0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
bac0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
bad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
bae0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
baf0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
bb00: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
bb10: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
bb20: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
bb30: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
bb40: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
bb50: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
bb60: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
bb70: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
bb80: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
bb90: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
bba0: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
bbb0: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
bbc0: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
bbd0: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
bbe0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
bbf0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
bc00: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
bc10: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
bc20: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
bc30: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
bc40: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
bc50: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
bc60: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
bc70: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
bc80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bc90: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
bca0: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
bcb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
bcc0: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
bcd0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
bce0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
bcf0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
bd00: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
bd10: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
bd20: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
bd30: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
bd40: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
bd50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bd60: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
bd70: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
bd80: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
bd90: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
bda0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
bdb0: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
bdc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
bdd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
bde0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
bdf0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
be00: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
be10: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
be20: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
be30: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
be40: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
be50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
be60: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
be70: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
be80: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
be90: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
bea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
beb0: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
bec0: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
bed0: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
bee0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
bef0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
bf00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
bf10: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
bf20: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
bf30: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
bf40: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
bf50: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
bf60: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
bf70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
bf80: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
bf90: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
bfa0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
bfc0: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
bfd0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
bfe0: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
bff0: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
c000: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
c010: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
c020: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
c030: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
c040: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
c050: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
c060: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
c070: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
c080: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
c090: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
c0a0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c0b0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
c0c0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c0d0: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c0e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c0f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c100: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c110: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c120: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c130: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c140: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c150: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c160: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c170: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c180: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c1a0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c1b0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c1c0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c1d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c1e0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c1f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c200: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c210: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c220: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c230: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c240: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c250: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c260: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c270: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c280: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c290: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c2a0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c2b0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c2c0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c2e0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c2f0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c300: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c310: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c320: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c330: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c340: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c350: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c360: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c370: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c380: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c390: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c3a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c3b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c3c0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c3d0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c3e0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c3f0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c400: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c410: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c420: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c430: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c450: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c460: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c470: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c480: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c490: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c4a0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c4b0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c4c0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c4d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c500: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c510: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c520: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c530: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c540: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c550: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c560: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c570: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c580: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c590: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c5a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c5b0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c5c0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c5d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c5e0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c5f0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c600: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c610: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c620: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c630: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c640: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c650: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c660: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c670: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c680: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c690: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c6a0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c6b0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c6c0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c6d0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c6e0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c6f0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c700: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c710: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c720: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c730: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c740: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c750: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c760: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c770: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c780: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c790: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c7a0: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c7b0: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c7c0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c7d0: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c7e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c7f0: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c800: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c810: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c820: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c840: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c850: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c860: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c870: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c880: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c890: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c8a0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c8b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c8c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c8d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c8e0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c8f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c900: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
c910: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
c920: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
c930: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
c940: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
c950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
c960: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
c970: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
c990: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
c9a0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
c9b0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
c9c0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c9d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
c9e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c9f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
ca00: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
ca10: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
ca20: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
ca30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ca40: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ca50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ca60: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
ca70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
ca80: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
ca90: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
caa0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
cab0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cac0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
cad0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
cae0: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
caf0: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
cb00: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
cb10: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
cb20: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
cb30: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
cb40: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
cb50: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
cb60: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
cb70: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cb80: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cb90: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cba0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cbb0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cbc0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
cbd0: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
cbe0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cc10: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cc20: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
cc30: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cc50: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cc60: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
cc70: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cc80: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cc90: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cca0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ccb0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
ccc0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
ccd0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cce0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
ccf0: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
cd00: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cd10: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
cd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cd30: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
cd40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cd50: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cd60: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
cd70: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
cd80: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
cd90: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
cda0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
cdb0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
cdc0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
cdd0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
cde0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
cdf0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
ce00: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
ce10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ce20: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
ce30: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
ce40: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
ce50: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
ce60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
ce70: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
ce80: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
ce90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cea0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ceb0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cec0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
ced0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cee0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
cef0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
cf00: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
cf10: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cf20: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
cf30: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
cf40: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
cf50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
cf60: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
cf70: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
cf80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
cf90: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
cfa0: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
cfb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
cfc0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
cfd0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
cfe0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
cff0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d000: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d010: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d020: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d030: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d040: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d050: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d060: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d070: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d080: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d090: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d0a0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d0b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d0c0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d0d0: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d0e0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d0f0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d100: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d110: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d120: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d130: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d140: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d150: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d160: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d170: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d180: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d190: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d1a0: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d1b0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d1c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d1d0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d1e0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d1f0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d200: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d210: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d220: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d230: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d240: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d250: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d270: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d280: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d290: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d2a0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d2b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d2c0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d2d0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d2e0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d2f0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d300: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d310: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d320: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d330: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d350: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d360: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d380: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d390: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d3b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d3c0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d3e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d3f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d400: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d410: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d420: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d430: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d440: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d450: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d460: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d470: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d480: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d4b0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d4c0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d4d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d4e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d4f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d500: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d510: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d520: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d540: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d550: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d560: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d570: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d580: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d590: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d5a0: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d5b0: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d5d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d5e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d5f0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d600: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d610: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d620: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d630: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d640: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d650: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d660: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d670: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d680: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d690: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d6a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d6b0: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d6c0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d6d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d6e0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d6f0: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d700: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d710: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d720: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d730: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d740: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d750: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d760: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d770: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d780: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d790: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d7a0: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d7b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d7c0: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d7d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d7e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d7f0: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d800: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d810: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d820: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
d840: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d850: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d860: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d870: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d880: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d890: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
d8a0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
d8b0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
d8c0: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
d8d0: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
d8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d8f0: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
d900: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
d910: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
d920: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
d930: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
d940: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
d950: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d960: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d970: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
d980: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d990: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
d9c0: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9e0: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
d9f0: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
da00: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
da10: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
da20: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
da30: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
da40: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
da50: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
da60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
da70: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
da80: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
da90: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
dac0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
dad0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
dae0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
db10: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db30: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
db40: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
db50: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
db60: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
db70: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
db80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
db90: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
dba0: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
dbb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
dbc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
dbd0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
dbe0: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
dbf0: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
dc00: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dc10: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dc20: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dc30: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
dc40: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
dc50: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
dc60: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
dc70: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
dc80: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
dc90: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
dca0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
dcb0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
dcc0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dcd0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dcf0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dd00: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dd10: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dd20: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
dd30: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
dd40: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
dd50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd60: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
dd70: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
dd80: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
dd90: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
dda0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
ddb0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
ddc0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
ddd0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dde0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
ddf0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
de00: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
de10: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
de20: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
de30: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
de40: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
de50: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
de60: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
de70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
de80: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
de90: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
dea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
deb0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
dec0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
ded0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
dee0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
def0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
df00: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
df10: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
df20: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
df30: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
df40: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
df50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
df60: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
df80: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
df90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
dfa0: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
dfb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
dfc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
dfd0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
dfe0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
dff0: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e000: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e010: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
e020: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e030: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
e040: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
e050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e060: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
e070: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
e080: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
e090: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
e0a0: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
e0b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e0c0: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e0d0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e0f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e100: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
e110: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e120: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e140: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e150: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e160: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e170: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e180: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e190: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e1a0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e1b0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e1c0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e1d0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e1e0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e1f0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e200: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e210: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e220: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e230: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e240: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e250: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e260: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e270: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e280: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e290: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e2a0: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e2b0: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e2c0: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e2d0: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e2e0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e2f0: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e300: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e310: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e320: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e340: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e350: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e360: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e370: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e380: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e390: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e3b0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e3c0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e3d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e3e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e3f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e410: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e420: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e430: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e440: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e450: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e470: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e4a0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e4b0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e4c0: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e4d0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e4e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e4f0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e500: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e510: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e520: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e530: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e540: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e550: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e560: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e570: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e580: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e590: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e5a0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e5b0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e5c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e5d0: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e5e0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e5f0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e600: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e620: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e630: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e640: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e650: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e660: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e670: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e680: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e690: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e6a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e6b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e6c0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e6d0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e6e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e6f0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e700: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e710: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e720: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e730: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e740: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e750: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e760: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e770: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e780: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e790: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e7a0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e7c0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e7d0: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e7e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e7f0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e800: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e810: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e820: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e840: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
e850: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
e860: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
e870: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
e880: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
e890: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e8a0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
e8b0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
e8c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e8d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
e8e0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
e8f0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79     if( pCol->zTy
e900: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pe==0 ){.      p
e910: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
e920: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e930: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e940: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
e950: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
e960: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
e970: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ));.    }.    sz
e980: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e990: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e9a0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9b0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
e9d0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
e9e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
e9f0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ea00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea20: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea30: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
ea40: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
ea50: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
ea60: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ea70: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
ea80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ea90: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
eaa0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
eab0: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
eac0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
ead0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
eae0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
eaf0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
eb00: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
eb10: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
eb20: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
eb30: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
eb40: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
eb50: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
eb60: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
eb70: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
eb80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb90: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
eba0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
ebb0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
ebc0: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ebd0: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
ebe0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
ebf0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
ec00: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
ec10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ec20: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
ec30: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ec40: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ec50: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
ec60: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
ec70: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
ec80: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
ec90: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
eca0: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
ecb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ecc0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
ecd0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
ece0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
ecf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
ed00: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
ed10: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
ed20: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
ed30: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
ed40: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
ed50: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
ed60: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
ed70: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
ed80: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
ed90: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
eda0: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
edb0: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
edc0: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
edd0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
ede0: 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74  576) );.  select
edf0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ee00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ee10: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ee20: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ee30: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
ee40: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
ee50: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
ee60: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
ee70: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
ee80: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
ee90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
eea0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
eeb0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
eec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
eed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
eee0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
eef0: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
ef00: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
ef10: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
ef20: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ef30: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
ef40: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
ef50: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
ef60: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
ef70: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
ef80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
ef90: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
efa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
efb0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
efc0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
efd0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
efe0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
eff0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f000: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
f010: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
f020: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
f030: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f040: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
f050: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
f060: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
f070: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
f080: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
f090: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f0a0: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
f0b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
f0c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f0d0: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
f0e0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
f0f0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
f100: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
f110: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f120: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
f130: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f140: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
f150: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
f160: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
f170: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
f180: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
f190: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
f1a0: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
f1b0: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f1c0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f1d0: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f1e0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f1f0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f200: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f210: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f220: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f230: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f240: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f250: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f260: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f270: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f280: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f290: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f2a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f2b0: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f2c0: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f2d0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f2e0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f2f0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f300: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f310: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f320: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f330: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f340: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f350: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f360: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f370: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f380: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f390: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f3a0: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f3b0: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f3c0: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f3d0: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f3e0: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f3f0: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f400: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f410: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f420: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f430: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f440: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f450: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f460: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f470: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f480: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f490: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f4a0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f4b0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f4c0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f4d0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f4e0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f4f0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f500: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f510: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f520: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f530: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f540: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f550: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f560: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f570: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f580: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f590: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f5a0: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a    int addr1, n;.
f5b0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
f5c0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
f5d0: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
f5e0: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
f5f0: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
f600: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
f610: 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
f620: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
f630: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
f640: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
f650: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
f660: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
f670: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
f680: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
f690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f6a0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
f6b0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
f6c0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
f6d0: 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
f6e0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
f6f0: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
f700: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
f710: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
f720: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f730: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
f740: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
f750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
f760: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
f770: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
f780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f790: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f7a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
f7b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f7c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f7d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f7e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
f7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f800: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
f810: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
f820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
f830: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
f840: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
f850: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
f860: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
f870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f880: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f890: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
f8a0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
f8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f8c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f8d0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
f8e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f8f0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f900: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f910: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f930: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
f940: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
f950: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f970: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
f980: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
f990: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
f9a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f9b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
f9c0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
f9d0: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
f9e0: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
f9f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fa00: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fa10: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
fa20: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
fa30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa40: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fa50: 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
fa60: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa70: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fa80: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
fa90: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
faa0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
fac0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  s, iOffset); Vdb
fad0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
faf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
fb00: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
fb10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fb30: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ddr1);.      sql
fb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fb50: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
fb60: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
fb70: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
fb80: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
fb90: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
fba0: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
fbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fbc0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
fbd0: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
fbe0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
fc10: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
fc20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fc30: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
fc50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc60: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
fc70: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
fc80: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
fc90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fca0: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
fcb0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
fcc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
fcd0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
fce0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fcf0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
fd00: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
fd10: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
fd20: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
fd30: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
fd40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fd50: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
fd60: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
fd70: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
fd80: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
fd90: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
fda0: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
fdb0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
fdc0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
fdd0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fde0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
fdf0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
fe00: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
fe10: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
fe20: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
fe30: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
fe40: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
fe50: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
fe60: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
fe70: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
fe80: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
fe90: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
fea0: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
feb0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
fec0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
fed0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
fee0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
fef0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
ff00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ff10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
ff20: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
ff30: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
ff40: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
ff50: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
ff60: 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
ff70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
ff80: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
ff90: 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
ffa0: 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
ffb0: 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
ffc0: 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
ffd0: 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
ffe0: 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
fff0: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
10000 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
10010 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10020 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
10030 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
10040 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10050 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10060 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10070 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10080 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10090 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
100a0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
100b0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
100c0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
100d0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
100e0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
100f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10100 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
10110 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10120 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
10130 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10140 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10150 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10160 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
10170 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
10180 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
10190 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
101a0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
101b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
101c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
101d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
101e0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
101f0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
10200 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
10210 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10220 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
10230 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
10240 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
10250 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10260 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10270 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
10280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10290 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
102a0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
102b0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
102c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
102d0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
102e0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
102f0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
10300 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
10310 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
10320 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10330 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
10340 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
10350 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
10360 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
10370 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10380 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10390 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
103a0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
103b0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
103c0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
103d0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
103e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
103f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
10400 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
10410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10420 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
10430 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
10440 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
10450 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
10460 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
10470 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
10480 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
10490 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
104a0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
104b0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
104c0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
104d0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10500 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
10510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
10520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
10540 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
10560 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
10570 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
10580 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
10590 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
105a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
105b0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
105c0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
105d0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
105e0 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65  >a[].isRecursive
105f0 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
10600 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
10610 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
10620 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
10630 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
10640 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
10650 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
10660 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
10670 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
10680 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
10690 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
106a0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
106b0 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
106c0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
106d0 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
106e0 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
106f0 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
10700 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
10710 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
10720 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
10730 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
10740 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
10750 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
10760 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
10770 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
10780 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
10790 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
107a0 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
107b0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
107c0 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
107d0 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
107e0 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
107f0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
10800 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
10810 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
10820 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
10830 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
10840 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
10850 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
10860 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
10870 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
10880 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
10890 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
108a0 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
108b0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
108c0 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
108d0 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
108e0 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
108f0 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
10900 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
10910 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
10920 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
10930 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
10940 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
10950 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
10960 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
10970 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
10980 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
10990 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
109a0 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
109b0 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
109c0 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
109d0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
109e0 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
109f0 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
10a00 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
10a10 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
10a20 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
10a30 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
10a40 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
10a50 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
10a60 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
10a70 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
10a80 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
10a90 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
10aa0 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
10ab0 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
10ac0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
10ad0 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
10ae0 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
10af0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
10b00 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
10b10 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
10b20 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
10b30 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
10b40 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
10b50 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
10b60 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
10b70 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
10b80 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
10b90 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
10ba0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
10bb0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
10bc0 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
10bd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10be0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10bf0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
10c00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10c10 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
10c20 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
10c30 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
10c40 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
10c50 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
10c60 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
10c70 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
10c80 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
10c90 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
10ca0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
10cb0 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
10cc0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
10cd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
10ce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
10cf0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
10d00 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
10d10 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10d20 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
10d30 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
10d40 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
10d50 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10d60 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
10d70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
10d80 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
10d90 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
10da0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
10db0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
10dc0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
10dd0 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
10de0 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
10df0 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
10e00 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
10e10 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
10e20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10e30 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
10e40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
10e50 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
10e60 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10e70 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
10e80 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
10e90 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10eb0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10ec0 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
10ed0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10ee0 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
10ef0 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
10f00 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
10f10 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
10f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
10f30 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
10f40 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
10f50 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
10f60 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
10f70 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
10f80 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10f90 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10fc0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10ff0 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
11000 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
11010 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
11020 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11030 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
11040 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
11050 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
11060 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
11070 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
11080 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
11090 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
110a0 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
110b0 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
110c0 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
110d0 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
110e0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
110f0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11100 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11110 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
11120 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
11130 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
11140 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
11150 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
11160 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
11170 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
11180 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11190 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
111a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
111b0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
111c0 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
111d0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66  ->pLimit;.  pOff
111e0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
111f0 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70  ;.  regLimit = p
11200 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f  ->iLimit;.  regO
11210 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
11220 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  et;.  p->pLimit 
11230 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  = p->pOffset = 0
11240 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
11250 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
11260 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
11270 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
11280 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
11290 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
112a0 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
112b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
112c0 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
112d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
112e0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63  pSrc->a[i].isRec
112f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
11300 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
11310 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
11320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11330 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
11340 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
11350 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
11360 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
11370 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
11380 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
11390 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
113a0 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
113b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
113c0 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
113d0 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
113e0 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
113f0 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
11400 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
11410 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
11420 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
11430 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11440 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
11450 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11460 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
11470 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
11480 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
11490 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
114a0 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
114b0 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
114c0 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
114d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
114e0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
114f0 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
11500 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
11510 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
11520 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
11530 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
11540 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
11550 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11560 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
11570 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
11580 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
11590 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
115a0 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
115b0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
115c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
115d0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
115e0 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
115f0 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
11600 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11610 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11620 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
11630 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
11640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11650 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11660 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11670 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
11680 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
11690 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
116a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
116b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
116c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
116d0 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
116e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
116f0 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
11700 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
11710 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
11720 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
11730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11740 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11750 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
11760 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
11770 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
11780 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
11790 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
117a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
117b0 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
117c0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
117d0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
117e0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
117f0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
11800 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
11810 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
11820 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
11830 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11840 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
11850 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
11860 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
11870 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
11880 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
11890 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
118a0 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
118b0 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
118c0 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
118d0 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
118e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
118f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
11900 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
11910 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
11920 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
11930 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
11940 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
11950 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
11960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11970 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
11980 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
11990 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
119a0 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
119b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
119c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
119d0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
119e0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
119f0 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
11a00 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
11a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
11a30 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
11a40 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
11a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11a60 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
11a70 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
11a80 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
11a90 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11aa0 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
11ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11ac0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
11ad0 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
11ae0 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
11af0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11b00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
11b10 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c  EList, iCurrent,
11b20 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
11b30 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
11b40 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
11b50 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
11b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
11b80 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
11b90 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
11ba0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11bc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11bd0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
11be0 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
11bf0 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11c00 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
11c10 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11c20 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
11c30 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
11c40 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
11c50 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
11c60 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
11c70 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11c90 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11ca0 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65  stQueue);.  asse
11cb0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
11cc0 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   );.  p->pPrior 
11cd0 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20  = pSetup;..  /* 
11ce0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
11cf0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
11d00 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
11d10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
11d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11d30 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
11d40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11d50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
11d60 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
11d70 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
11d80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11d90 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
11da0 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
11db0 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
11dc0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
11dd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
11de0 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  t;.  p->pOffset 
11df0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74  = pOffset;.  ret
11e00 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11e20 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
11e30 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
11e40 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
11e50 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
11e60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11e70 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11e80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11e90 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11ea0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
11eb0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
11ec0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
11ed0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
11ee0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
11ef0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
11f00 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
11f10 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
11f20 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
11f30 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
11f40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
11f50 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
11f60 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
11f70 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   sets..*/.static
11f80 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f 6e   void selectWron
11f90 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
11fa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11fb0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
11fc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
11fd0 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
11fe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11ff0 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
12000 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
12010 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
12020 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
12030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12040 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
12050 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
12060 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
12070 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
12080 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12090 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
120a0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
120b0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
120c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  ;.  }.}../*.** H
120d0 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
120e0 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
120f0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
12100 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12110 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12120 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12130 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
12140 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
12150 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
12160 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
12170 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
12180 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
12190 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
121a0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
121b0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
121c0 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
121d0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
121e0 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
121f0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
12200 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12210 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12220 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12230 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
12240 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
12250 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12260 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
12270 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
12280 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
12290 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
122a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
122b0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
122c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
122d0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
122e0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
122f0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12300 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12310 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12320 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12330 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
12340 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
12350 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
12360 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  ist->nExpr;.  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 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
12470 45 78 70 72 21 3d 6e 45 78 70 72 20 29 7b 0a 20  Expr!=nExpr ){. 
12480 20 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67       selectWrong
12490 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
124a0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
124b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
124c0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
124d0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
124e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
124f0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
12500 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
12510 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
12520 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
12530 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
12540 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
12550 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
12560 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
12570 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12580 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
12590 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
125a0 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
125b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
125c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
125d0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
125e0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
125f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12610 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
12620 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
12630 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
12640 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
12650 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
12660 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
12670 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
12680 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
12690 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
126a0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
126b0 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
126c0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
126d0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
126e0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
126f0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
12700 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
12710 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
12720 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
12730 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12740 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
12750 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
12760 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
12770 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
12780 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
12790 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
127a0 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
127b0 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
127c0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
127d0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
127e0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
127f0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
12800 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
12810 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
12820 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
12830 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
12840 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
12860 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
12870 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
12880 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
12890 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
128a0 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
128b0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
128c0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
128d0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
128e0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
128f0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
12900 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
12910 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
12920 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
12930 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
12940 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
12950 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
12960 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12970 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
12980 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
12990 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
129a0 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
129b0 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
129c0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
129d0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
129e0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
129f0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
12a00 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
12a10 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
12a20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
12a30 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
12a40 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
12a50 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
12a60 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
12a70 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
12a80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12aa0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12ac0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12ad0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12ae0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12af0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12b00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12b10 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
12b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
12b40 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
12b50 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
12b60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
12b70 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
12b80 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
12b90 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
12ba0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
12bb0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12bc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12bd0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
12be0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12bf0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
12c00 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
12c10 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
12c20 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
12c30 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
12c40 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
12c50 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
12c60 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
12c70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12c80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
12c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12ca0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
12cb0 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
12cc0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12cd0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
12ce0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
12cf0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12d00 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
12d10 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
12d20 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
12d30 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
12d40 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12d50 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
12d60 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
12d70 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
12d80 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
12d90 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
12da0 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
12db0 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
12dc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
12dd0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
12de0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
12df0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
12e00 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
12e10 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
12e20 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
12e30 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
12e40 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
12e50 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
12e60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12e70 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
12e80 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
12e90 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
12ea0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
12eb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12ec0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
12ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
12ee0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
12ef0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
12f00 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
12f10 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
12f20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
12f30 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12f40 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
12f50 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
12f60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12f70 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
12f80 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
12f90 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
12fa0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
12fb0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
12fc0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
12fd0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
12fe0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
12ff0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13000 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13010 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13020 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
13030 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
13040 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
13050 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
13060 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
13070 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
13080 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
13090 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
130a0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
130b0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
130c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
130d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
130e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
130f0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
13100 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
13110 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
13120 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13130 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
13140 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
13150 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
13160 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
13170 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
13180 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
13190 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
131a0 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
131b0 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
131c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
131d0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
131e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
131f0 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
13200 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13210 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13220 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13230 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13240 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
13250 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
13260 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
13270 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
13280 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
13290 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
132a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
132b0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
132c0 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
132d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
132e0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
132f0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 65 6c  nExpr ){.    sel
13300 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
13310 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 29  Error(pParse, p)
13320 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
13330 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13340 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69  ect_end;.  }..#i
13350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13360 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
13370 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
13380 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
13390 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
133a0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
133b0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
133c0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
133d0 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
133e0 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
133f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
13400 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
13410 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
13420 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13430 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
13440 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
13450 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
13460 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
13470 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
13480 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
13490 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
134a0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
134b0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
134c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
134d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
134e0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
134f0 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
13500 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
13510 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
13520 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
13530 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
13540 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
13550 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
13560 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
13570 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
13580 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13590 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
135a0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
135b0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
135c0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
135d0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
135e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
135f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
13600 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
13610 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
13620 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
13630 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
13640 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
13650 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13660 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
13670 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
13680 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
13690 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
136a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
136b0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
136c0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
136d0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
136e0 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
136f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13700 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
13710 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
13720 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13730 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13740 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
13750 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
13760 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
13770 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13780 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
13790 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
137a0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
137b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
137c0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
137d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
137e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137f0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
13800 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13810 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
13820 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13830 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
13840 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
13850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
13860 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
13870 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
13880 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
13890 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
138a0 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
138b0 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
138c0 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
138d0 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
138e0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
138f0 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
13900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13910 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
13920 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13930 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13960 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
13970 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
13980 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
13990 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
139a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
139b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
139c0 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
139d0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
139f0 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
13a00 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
13a10 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
13a20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
13a30 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
13a40 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
13a50 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
13a60 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
13a70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
13a80 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
13a90 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
13aa0 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
13ab0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
13ac0 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13ad0 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
13ae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13af0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13b00 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13b10 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
13b20 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
13b30 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
13b40 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
13b50 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
13b60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
13b70 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
13b80 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
13b90 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
13ba0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13bb0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13bd0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13be0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13bf0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13c00 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13c20 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
13c30 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
13c40 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
13c50 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
13c60 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13c70 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
13c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c90 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
13ca0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13cb0 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13cc0 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13cd0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13ce0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13cf0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13d00 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13d10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13d20 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
13d30 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13d40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
13d50 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
13d70 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
13d80 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
13d90 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
13da0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13db0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13dc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13dd0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13de0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13df0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13e00 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13e30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13e40 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
13e50 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
13e60 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
13e70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
13e80 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
13e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
13ea0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
13eb0 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
13ec0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
13ed0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13ee0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13ef0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13f00 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13f10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13f20 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
13f30 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13f50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13f60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13f70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13f80 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
13f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
13fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13fb0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13fc0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
13fd0 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
13fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ff0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
14000 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14010 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
14020 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
14030 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14040 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14050 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14060 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14070 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14080 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14090 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
140a0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
140b0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
140c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
140d0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
140e0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
140f0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14100 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14110 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
14120 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
14130 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14140 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
14150 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
14160 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
14170 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
14180 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
14190 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
141a0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
141b0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
141c0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
141d0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
141e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
141f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
14200 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
14210 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14220 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14230 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14240 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
14250 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
14260 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14270 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
14280 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
14290 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
142a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
142b0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
142c0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
142d0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
142e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
142f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
14300 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
14310 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
14320 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
14330 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
14340 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14350 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
14360 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
14370 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
14380 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
14390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
143a0 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
143b0 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
143c0 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
143d0 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
143e0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
143f0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
14400 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
14410 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
14420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14430 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
14440 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14450 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14460 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14470 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14480 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14490 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
144a0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
144b0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
144c0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
144d0 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
144e0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
144f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14500 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14510 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14520 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
14530 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14540 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14550 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14560 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14570 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
14580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14590 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
145a0 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
145b0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
145c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
145d0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
145e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
145f0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
14600 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14610 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
14620 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  ist, unionTab,. 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
14650 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
14660 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
14670 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14680 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
14690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
146a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
146b0 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
146c0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
146d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
146e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
14700 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14720 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
14730 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
14740 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14750 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
14760 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
14770 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
14780 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
14790 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
147a0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
147b0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
147c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
147d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
147e0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
147f0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
14800 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
14810 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
14820 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
14830 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
14840 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
14850 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
14860 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
14870 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
14880 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
14890 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
148a0 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
148b0 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
148c0 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
148d0 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
148e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
148f0 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
14900 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14910 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14920 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
14930 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14950 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14960 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
14970 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14980 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
14990 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
149a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
149b0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
149c0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
149d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
149e0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
149f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14a00 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
14a10 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
14a20 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
14a30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14a40 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
14a50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
14a60 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14a70 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
14a80 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
14a90 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
14aa0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14ab0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14ac0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14ae0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14af0 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
14b00 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
14b10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
14b20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14b30 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
14b40 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
14b50 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
14b60 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
14b70 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
14b80 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14bb0 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
14bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14bd0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14be0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14bf0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14c00 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
14c10 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
14c20 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
14c30 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
14c40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
14c50 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
14c60 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
14c70 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14c80 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
14c90 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
14ca0 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
14cb0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14cc0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14cd0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14cf0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14d00 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
14d10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14d30 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14d40 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14d50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14d60 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
14d70 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
14d80 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14d90 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
14da0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14db0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14dc0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14dd0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14de0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14df0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14e00 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
14e10 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
14e20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e30 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
14e40 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
14e50 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
14e60 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
14e70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14e80 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
14e90 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14ea0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14eb0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
14ec0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14ed0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
14ee0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
14ef0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14f00 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
14f10 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14f20 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
14f30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f50 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
14f60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14f70 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
14f80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14fa0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14fb0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14fc0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fe0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14ff0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
15000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15010 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15020 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15030 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
15040 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15060 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
15070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15080 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
15090 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
150a0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
150b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
150c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
150d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
150e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
150f0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15100 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
15110 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
15140 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15160 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15170 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
15180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15190 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
151a0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
151b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
151c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
151d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
151e0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
151f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15200 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
15210 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15230 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
15240 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
15260 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15270 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
15280 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
15290 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
152a0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
152b0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
152c0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
152d0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
152e0 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
152f0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
15300 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
15310 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
15320 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
15330 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
15350 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
15360 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
15370 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15380 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
15390 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
153a0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
153b0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
153c0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
153d0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
153e0 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
153f0 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
15400 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15410 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
15420 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
15430 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
15440 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15450 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
15460 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
15470 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15490 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
154a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
154b0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
154c0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
154d0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
154e0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
154f0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15510 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
15520 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
15530 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
15540 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
15550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15560 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
15570 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
15580 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
15590 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
155a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
155b0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
155c0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
155d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
155e0 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
155f0 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
15600 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
15610 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
15620 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
15630 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
15640 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
15650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15660 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
15670 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15680 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
15690 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
156a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
156b0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
156c0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
156d0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
156e0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
156f0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
15700 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
15710 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
15720 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15740 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
15750 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
15760 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
15770 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15780 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
15790 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
157a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
157b0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
157c0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
157d0 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
157e0 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
157f0 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
15800 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
15810 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
15820 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
15830 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
15840 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
15850 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
15860 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
15870 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15880 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
15890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
158a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
158b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
158c0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
158f0 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
15900 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
15910 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
15940 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
15950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
15960 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
15970 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
15980 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
15990 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
159a0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
159b0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
159c0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
159d0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
159e0 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
159f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15a00 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
15a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
15a20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15a30 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15a40 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
15a50 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
15a60 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
15a70 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
15a80 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
15a90 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
15aa0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
15ab0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
15ac0 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
15ad0 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
15ae0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
15af0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
15b00 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
15b10 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
15b20 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
15b30 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
15b40 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
15b50 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
15b60 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
15b70 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
15b80 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
15b90 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
15ba0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
15bb0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
15bc0 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
15bd0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
15be0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
15bf0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
15c00 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
15c10 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
15c20 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
15c30 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
15c40 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
15c50 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
15c60 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
15c70 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
15c80 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
15c90 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
15ca0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
15cb0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
15cc0 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
15cd0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
15ce0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
15cf0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
15d00 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
15d10 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
15d20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15d30 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15d40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15d50 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15d60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
15d70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
15d80 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15d90 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
15da0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
15db0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
15dc0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
15dd0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
15de0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
15df0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
15e00 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
15e10 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
15e20 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
15e30 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
15e40 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
15e50 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
15e60 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
15e70 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
15e80 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15e90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
15ea0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
15eb0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
15ec0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
15ed0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15ee0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
15ef0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
15f00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15f10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15f20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
15f30 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
15f40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15f50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
15f60 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
15f70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15f80 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
15f90 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
15fa0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15fb0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
15fc0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15fd0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
15fe0 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
15ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16000 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
16010 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
16020 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d  age(v);.    j2 =
16030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16040 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
16050 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16060 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16070 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
160a0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
160b0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
160c0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
160d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
160e0 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
160f0 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64  tinue, j2+2); Vd
16100 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16120 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
16130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16140 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
16150 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16160 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16170 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
16180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16190 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
161a0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
161b0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
161c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
161d0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
161e0 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
161f0 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
16200 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
16210 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
16220 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
16230 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
16240 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
16250 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16260 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
16270 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
16280 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
16290 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
162a0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
162b0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
162c0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
162d0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
162e0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
162f0 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16300 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16310 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16320 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16330 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16340 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16350 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16370 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16380 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16390 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
163c0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
163d0 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
163e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163f0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16400 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16410 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16420 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16430 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16440 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16450 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16460 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
16470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16480 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16490 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
164a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
164b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
164c0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
164d0 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
164e0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
164f0 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
16500 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
16510 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
16520 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
16530 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
16540 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
16550 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
16560 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
16570 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
16580 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
16590 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
165a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
165b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
165c0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
165d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
165e0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
165f0 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
16600 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
16610 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
16620 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
16630 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
16640 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16650 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16660 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16680 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16690 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
166a0 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
166b0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
166c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
166d0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
166e0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
166f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
16700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16710 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16720 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16730 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16740 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16750 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16770 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16780 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
16790 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
167a0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
167b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
167c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
167d0 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
167e0 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
167f0 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
16800 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
16810 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
16820 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
16830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16840 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16850 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16860 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
16870 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
16880 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16890 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
168a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
168b0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
168c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
168d0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
168e0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
168f0 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
16900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16910 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
16920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16930 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16940 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16950 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16960 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16970 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16980 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16990 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
169a0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
169b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
169c0 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
169d0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
169e0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
169f0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16a00 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16a10 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16a20 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16a30 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16a40 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16a50 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16a60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16a70 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16a80 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16a90 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16aa0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16ac0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16ad0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16af0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16b00 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16b10 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16b20 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16b30 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
16b40 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
16b50 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
16b60 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
16b70 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
16b80 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
16b90 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16ba0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16bb0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16bc0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16bd0 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16be0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16bf0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16c00 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16c10 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16c20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16c30 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
16c40 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
16c50 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
16c60 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
16c70 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16c80 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
16c90 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16ca0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16cd0 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16ce0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16d00 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16d10 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16d20 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16d30 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16d40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16d50 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16d60 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16d70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16d80 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16d90 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16db0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
16dc0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
16dd0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
16de0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16e00 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
16e10 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
16e20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16e30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
16e40 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
16e50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16e60 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
16e70 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
16e80 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
16e90 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
16ea0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
16eb0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
16ec0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
16ed0 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
16ee0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
16ef0 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
16f00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16f10 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
16f20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
16f30 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
16f40 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
16f50 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
16f60 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
16f70 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
16f80 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
16f90 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
16fa0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
16fb0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
16fc0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
16fd0 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
16fe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
16ff0 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
17000 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
17010 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
17020 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
17030 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
17040 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
17050 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
17060 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17070 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
17080 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
17090 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
170a0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
170b0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
170c0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
170d0 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
170e0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
170f0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
17100 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17110 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
17120 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
17130 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17140 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
17150 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17160 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17170 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17180 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
17190 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
171a0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
171b0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
171c0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
171d0 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
171e0 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
171f0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
17200 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
17210 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
17220 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
17230 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17240 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17250 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
17260 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
17270 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17280 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
17290 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
172a0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
172b0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
172c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
172d0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
172e0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
172f0 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
17300 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
17310 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17320 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17330 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
17340 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
17350 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17360 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17370 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
17380 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
17390 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
173a0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
173b0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
173c0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
173d0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
173e0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
173f0 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
17400 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
17410 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
17420 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
17430 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
17440 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17450 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17460 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17470 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
17480 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17490 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
174a0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
174b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
174c0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
174d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
174e0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
174f0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
17500 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
17510 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
17520 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17530 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17540 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
17550 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
17560 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
17570 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17580 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17590 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
175a0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
175b0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
175c0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
175d0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
175e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
175f0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
17600 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
17610 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
17620 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
17630 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
17640 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
17650 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
17660 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
17670 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
17680 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
17690 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
176a0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
176b0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
176c0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
176d0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
176e0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
176f0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
17700 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
17710 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
17720 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
17730 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
17740 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
17750 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
17760 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
17770 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
17780 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
17790 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
177a0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
177b0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
177c0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
177d0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
177e0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
177f0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
17800 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
17810 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
17820 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
17830 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
17840 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
17850 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
17860 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
17870 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
17880 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
17890 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
178a0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
178b0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
178c0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
178d0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
178e0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
178f0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
17900 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17910 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
17920 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
17930 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
17940 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
17950 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
17960 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
17970 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
17980 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
17990 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
179a0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
179b0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
179c0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
179d0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
179e0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
179f0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
17a00 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
17a10 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
17a20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
17a30 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
17a40 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
17a50 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
17a60 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
17a70 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
17a80 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
17a90 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
17aa0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
17ab0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
17ac0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
17ad0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
17ae0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
17af0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
17b00 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
17b10 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
17b20 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
17b30 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
17b40 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
17b50 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
17b60 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
17b70 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
17b80 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
17b90 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
17ba0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
17bb0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
17bc0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
17bd0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
17be0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
17bf0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17c00 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
17c10 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
17c20 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
17c30 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
17c40 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17c50 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
17c60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17c80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
17c90 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
17ca0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
17cb0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
17cc0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
17cd0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
17ce0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
17cf0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
17d00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
17d10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
17d20 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
17d30 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
17d40 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
17d50 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
17d60 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17d70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17d80 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
17d90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17da0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
17db0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17dc0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
17dd0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
17de0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
17df0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
17e00 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
17e10 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
17e20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
17e30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
17e40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17e50 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
17e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17e70 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17e80 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17e90 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17ea0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
17eb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17ec0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
17ed0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17ee0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
17ef0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17f00 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17f10 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
17f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17f30 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
17f40 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
17f50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17f60 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
17f70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17f80 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
17f90 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
17fa0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17fb0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
17fc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17fd0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
17fe0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17ff0 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
18000 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18010 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18020 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18030 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
18040 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18050 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
18060 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18070 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18080 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
18090 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
180a0 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
180b0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
180c0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
180d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
180e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
180f0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18100 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18110 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
18120 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18130 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
18140 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
18150 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18160 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
18170 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18180 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
18190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
181a0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
181b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
181c0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
181d0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
181e0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
181f0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
18200 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
18210 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18220 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18230 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
18240 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
18250 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
18260 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
18270 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18280 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
18290 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
182a0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
182b0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
182c0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
182d0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
182e0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
182f0 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
18300 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18310 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
18320 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
18330 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
18340 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
18350 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
18360 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
18370 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
18380 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
18390 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
183a0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
183b0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
183c0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
183d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
183e0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
183f0 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
18400 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
18410 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18420 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
18430 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
18440 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
18450 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
18460 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
18470 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
18480 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
18490 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
184a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
184b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
184c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
184d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
184e0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
184f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18500 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
18510 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
18520 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18530 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
18540 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18550 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
18560 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
18570 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
18580 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
18590 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
185a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
185b0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
185c0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
185d0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
185e0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
185f0 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
18600 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
18610 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
18620 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
18630 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
18640 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
18650 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
18660 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
18670 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
18680 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
18690 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
186a0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
186b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
186c0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
186d0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
186e0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
186f0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
18700 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
18710 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18720 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18730 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
18740 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18750 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
18760 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
18770 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
18780 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
18790 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
187a0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
187b0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
187c0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
187d0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
187e0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
187f0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
18800 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
18810 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
18820 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
18830 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
18840 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
18850 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
18860 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
18870 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
18880 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
18890 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
188a0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
188b0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
188c0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
188d0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
188e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
188f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
18900 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
18910 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
18920 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18930 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18940 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
18950 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18960 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
18970 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
18980 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18990 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
189a0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
189b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
189c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
189d0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
189e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
189f0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
18a00 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
18a10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
18a20 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
18a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
18a40 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
18a50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18a60 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18a70 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18a80 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18a90 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18aa0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18ab0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18ac0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18ad0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18ae0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18af0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18b00 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18b10 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18b20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b40 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18b50 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18b60 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18b70 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18b80 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18b90 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18ba0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18bb0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18bc0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18bd0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18be0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18bf0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18c00 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18c10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c20 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18c30 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18c40 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
18c50 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
18c60 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
18c70 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
18c80 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
18c90 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
18ca0 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
18cb0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
18cc0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
18cd0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18ce0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18cf0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18d00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
18d10 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
18d20 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
18d30 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
18d40 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18d50 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18d60 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18d70 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
18d80 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18d90 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
18da0 2d 3e 6e 45 78 70 72 20 29 20 69 73 20 61 6c 73  ->nExpr ) is als
18db0 6f 20 74 72 75 65 0a 20 20 20 20 20 20 2a 2a 20  o true.      ** 
18dc0 62 75 74 20 6f 6e 6c 79 20 66 6f 72 20 77 65 6c  but only for wel
18dd0 6c 2d 66 6f 72 6d 65 64 20 53 45 4c 45 43 54 20  l-formed SELECT 
18de0 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20  statements. */. 
18df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18e00 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18e10 42 79 43 6f 6c 20 3e 20 70 2d 3e 70 45 4c 69 73  ByCol > p->pELis
18e20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
18e30 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
18e40 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18e50 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
18e60 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
18e70 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
18e80 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
18e90 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
18ea0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
18eb0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
18ec0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
18ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
18ee0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
18ef0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
18f00 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
18f10 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
18f20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18f30 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
18f40 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
18f50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
18f60 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
18f70 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
18f80 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
18f90 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
18fa0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
18fb0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
18fc0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
18fd0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
18fe0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
18ff0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
19000 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
19010 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
19020 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19030 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
19040 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
19050 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
19060 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
19070 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
19080 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
19090 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
190a0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
190b0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
190c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
190d0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
190e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
190f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
19100 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
19110 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
19120 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
19130 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
19140 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
19150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19160 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
19170 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
19180 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19190 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
191a0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
191b0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
191c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
191d0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
191e0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
191f0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
19200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19210 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
19220 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
19230 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
19240 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
19250 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
19260 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
19270 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
19280 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
19290 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
192a0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
192b0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
192c0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
192d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
192e0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
192f0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
19300 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
19310 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
19320 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
19330 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
19340 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
19350 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
19360 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
19370 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
19380 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
19390 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
193a0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
193b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
193c0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
193d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
193e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193f0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
19400 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
19410 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
19420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
19450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19460 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
19470 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
19480 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
19490 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
194a0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
194b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
194c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
194d0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
194e0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
194f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19500 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
19510 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
19520 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
19530 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19540 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
19550 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19560 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
19570 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
19580 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19590 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
195a0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
195b0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
195c0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
195d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
195e0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
195f0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19600 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
19610 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
19620 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
19630 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19640 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
19650 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
19660 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
19670 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
19680 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19690 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
196a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
196b0 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
196c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
196d0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
196e0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
196f0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
19700 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
19710 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
19720 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
19730 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
19740 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19750 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
19760 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19770 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19780 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
19790 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
197a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
197b0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
197c0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
197d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
197e0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20  e(v, j1);..  /* 
197f0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
19800 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19810 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19820 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
19830 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
19840 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
19850 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
19860 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19870 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
19880 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
19890 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
198a0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
198b0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
198c0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
198d0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
198e0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
198f0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
19900 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
19910 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
19920 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
19930 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
19940 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
19950 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
19960 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
19970 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
19980 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19990 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
199a0 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
199b0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
199c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
199d0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
199e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
199f0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
19a00 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
19a10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19a20 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19a30 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19a40 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
19a50 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19a60 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19a70 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19a80 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19a90 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19aa0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
19ab0 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
19ac0 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
19ad0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19ae0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19b00 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
19b10 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
19b20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19b30 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19b40 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
19b50 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19b60 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19b70 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19b80 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
19b90 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19ba0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19bb0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19bc0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
19bd0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
19be0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
19bf0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19c00 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19c10 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
19c20 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
19c30 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19c40 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c60 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
19c70 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19c90 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19ca0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
19cb0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
19cc0 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
19cd0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19ce0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
19cf0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
19d00 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
19d10 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
19d20 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19d30 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
19d40 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19d50 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
19d60 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
19d70 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19d80 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
19d90 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
19da0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
19db0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19dc0 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
19dd0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
19de0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
19df0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19e00 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
19e10 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
19e20 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
19e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19e40 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19e50 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
19e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19e90 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19ea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19eb0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19ec0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
19ed0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
19ee0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
19ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19f00 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19f10 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19f20 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19f30 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
19f40 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19f50 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19f60 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
19f70 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
19f80 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19f90 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
19fa0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
19fb0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
19fc0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
19fd0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
19fe0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19ff0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1a000 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a010 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1a020 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a030 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1a040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a050 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a060 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1a070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a090 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1a0a0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1a0b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a0d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1a0e0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1a0f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a100 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a110 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1a120 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1a130 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1a140 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a150 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1a160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a170 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a180 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1a190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a1a0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a1b0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1a1c0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1a1d0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a1e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a1f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a200 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1a210 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a220 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1a230 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1a240 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a250 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1a260 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1a270 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a280 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1a290 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a2a0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1a2b0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1a2c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a2d0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1a2e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1a2f0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1a300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a310 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a320 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a330 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a350 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a360 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
1a370 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a380 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a390 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1a3a0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a3b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1a3c0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a3d0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1a3e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a3f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1a400 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1a410 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1a420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a430 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a440 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1a450 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1a460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a470 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a480 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1a490 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a4a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a4b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a4c0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
1a4d0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1a4e0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1a4f0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1a500 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1a510 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a520 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
1a530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a540 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a550 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1a560 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a570 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a580 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a590 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1a5a0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1a5b0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1a5c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1a5d0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1a5e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a5f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1a600 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1a610 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a620 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1a630 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1a640 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1a650 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1a660 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a670 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1a680 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1a690 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1a6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a6c0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1a6d0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1a6e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a6f0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1a700 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a710 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1a720 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1a730 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1a740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a750 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1a760 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1a770 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1a780 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1a790 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a7a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a7b0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1a7c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
1a7d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
1a7e0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1a7f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a800 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
1a810 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
1a820 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
1a830 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
1a840 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
1a850 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
1a860 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1a870 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
1a880 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
1a890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
1a8a0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1a8b0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1a8c0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1a8d0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1a8e0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1a8f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1a900 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1a910 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a920 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1a930 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1a940 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1a950 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1a960 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1a970 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1a980 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1a990 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1a9a0 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1a9b0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1a9c0 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
1a9d0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
1a9e0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
1a9f0 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
1aa00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1aa10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1aa20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aa30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1aa40 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1aa50 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1aa60 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1aa70 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1aa80 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1aa90 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
1aaa0 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1aab0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1aac0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1aad0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
1aae0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
1aaf0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
1ab00 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1ab10 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1ab20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1ab30 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1ab40 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1ab50 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1ab60 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1ab70 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1ab80 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1ab90 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1aba0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1abb0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1abc0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1abd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1abe0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1abf0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1ac00 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1ac10 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1ac20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1ac30 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1ac40 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1ac50 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1ac60 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1ac70 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1ac80 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ac90 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1aca0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1acb0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1acc0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1acd0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1ace0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1acf0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1ad00 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1ad10 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1ad20 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1ad30 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1ad40 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1ad50 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1ad60 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1ad70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1ad80 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1ad90 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1ada0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1adb0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1adc0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1add0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1ade0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1adf0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1ae00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ae10 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1ae20 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1ae30 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1ae40 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1ae50 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1ae60 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1ae70 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1ae80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1ae90 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1aea0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1aeb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1aec0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1aed0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1aee0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1aef0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1af00 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1af10 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1af20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1af30 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1af40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1af50 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1af60 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1af70 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1af80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1af90 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1afa0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1afb0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1afc0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1afd0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1afe0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1aff0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b000 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b010 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b020 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b030 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b040 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b050 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b060 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b070 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b080 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b090 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b0a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b0b0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b0c0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b0d0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b0e0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1b0f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1b100 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1b110 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1b120 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b130 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b140 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1b150 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1b160 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1b170 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1b180 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1b190 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1b1a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1b1b0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1b1c0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1b1d0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1b1e0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1b1f0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b200 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1b210 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1b220 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1b230 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b240 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1b250 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b260 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1b270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b280 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b290 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1b2a0 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1b2b0 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1b2c0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1b2d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1b2e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1b2f0 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1b300 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b310 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1b320 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1b330 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1b340 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1b350 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1b360 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1b370 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1b380 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b390 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1b3a0 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1b3b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b3c0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b3d0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b3e0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b3f0 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b400 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b420 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1b430 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b440 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1b450 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1b460 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b470 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b480 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b490 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b4a0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1b4b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b4c0 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1b4d0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1b4e0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1b4f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1b500 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b510 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1b520 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b530 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1b540 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1b550 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b560 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1b570 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1b580 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1b590 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1b5a0 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1b5b0 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1b5c0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1b5d0 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1b5e0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1b5f0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1b600 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1b610 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1b620 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1b630 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b640 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1b650 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1b660 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b670 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b680 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b690 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b6a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b6b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b6c0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1b6d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1b6e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b6f0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1b700 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1b710 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1b720 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1b730 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1b740 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1b750 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1b760 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1b770 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1b780 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1b790 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1b7a0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1b7b0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1b7c0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1b7d0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1b7e0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1b7f0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1b800 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1b810 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1b820 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1b830 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1b840 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1b850 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1b860 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1b870 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1b880 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1b890 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1b8a0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1b8b0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1b8c0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1b8d0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1b8e0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1b8f0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1b900 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1b910 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1b920 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1b930 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1b940 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1b950 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1b960 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1b970 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b980 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1b990 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1b9a0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1b9b0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1b9c0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1b9d0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1b9e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1b9f0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1ba00 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1ba10 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1ba20 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1ba30 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1ba40 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1ba50 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1ba60 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1ba70 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1ba80 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1ba90 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1baa0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1bab0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1bac0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1bad0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1bae0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1baf0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1bb00 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1bb10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bb20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1bb30 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1bb40 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1bb50 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1bb60 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1bb70 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1bb80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bb90 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1bba0 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1bbb0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bbc0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1bbd0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1bbe0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1bbf0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1bc00 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1bc10 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1bc20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1bc30 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1bc40 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1bc50 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1bc60 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1bc70 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1bc80 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1bc90 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1bca0 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1bcb0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1bcc0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1bcd0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1bce0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1bcf0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1bd00 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1bd10 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1bd20 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1bd30 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1bd40 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1bd50 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1bd60 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1bd70 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1bd80 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1bd90 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1bda0 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1bdb0 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1bdc0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1bdd0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1bde0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1bdf0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1be00 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1be10 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1be20 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1be30 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1be40 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1be50 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1be60 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1be70 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1be80 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1be90 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1bea0 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1beb0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1bec0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1bed0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1bee0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1bef0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1bf00 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1bf10 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1bf20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1bf30 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1bf40 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1bf50 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1bf60 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1bf70 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1bf80 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1bf90 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1bfa0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1bfb0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1bfc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bfd0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1bfe0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1bff0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c000 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c010 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c020 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c030 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c040 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c050 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c060 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c070 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c080 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c090 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c0a0 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c0b0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c0c0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c0d0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c0e0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c0f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c100 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c110 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c120 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64  ery .**        d
1c130 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c140 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  T.".**.**  (11) 
1c150 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c160 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1c170 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
1c180 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1c190 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1c1a0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1c1b0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1c1c0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1c1d0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1c1e0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1c1f0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1c200 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1c210 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1c220 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1c230 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1c240 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c250 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1c260 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1c270 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c280 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1c290 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
1c2a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c2b0 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
1c2c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
1c2d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
1c2e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c2f0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
1c300 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
1c310 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
1c320 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
1c330 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
1c340 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
1c350 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c360 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1c370 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c380 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
1c390 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
1c3a0 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1c3b0 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1c3c0 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1c3d0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1c3e0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1c3f0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1c400 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1c410 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
1c420 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
1c430 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
1c440 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
1c450 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
1c460 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
1c470 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
1c480 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1c490 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
1c4a0 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
1c4b0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1c4c0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c4d0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
1c4e0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c4f0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
1c500 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c510 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
1c520 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
1c530 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c540 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  a join.**.**    
1c550 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
1c560 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
1c570 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
1c580 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
1c590 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
1c5a0 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
1c5b0 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
1c5c0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
1c5d0 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
1c5e0 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
1c5f0 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  ET clauses.  The
1c600 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74   subquery cannot
1c610 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   use any compoun
1c620 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1c630 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
1c640 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73  UNION ALL becaus
1c650 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
1c660 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1c670 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76     operators hav
1c680 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53  e an implied DIS
1c690 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64  TINCT which is d
1c6a0 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20  isallowed by.** 
1c6b0 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69         restricti
1c6c0 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  on (4)..**.**   
1c6d0 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20       Also, each 
1c6e0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65  component of the
1c6f0 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20   sub-query must 
1c700 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1c710 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
1c720 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
1c730 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75  ns. This is actu
1c740 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65  ally a requireme
1c750 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f  nt for any compo
1c760 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45  und.**        SE
1c770 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1c780 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65  but all the code
1c790 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61   here does is ma
1c7a0 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a  ke sure that no.
1c7b0 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28  **        such (
1c7c0 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65  illegal) sub-que
1c7d0 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e  ry is flattened.
1c7e0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1c7f0 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20   detect the.**  
1c800 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72        syntax err
1c810 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  or and return a 
1c820 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65  detailed message
1c830 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
1c840 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1c850 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1c860 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
1c870 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
1c880 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
1c890 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
1c8a0 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
1c8b0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
1c8c0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
1c8d0 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
1c8e0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
1c8f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c900 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c910 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c920 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1c930 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1c940 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1c950 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1c960 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1c970 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c980 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1c990 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1c9a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1c9b0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1c9c0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1c9d0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1c9e0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1c9f0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1ca00 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1ca10 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1ca20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1ca30 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1ca40 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1ca50 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1ca60 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1ca70 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1ca80 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1ca90 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1caa0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1cab0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1cac0 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (21)  The subque
1cad0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cae0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1caf0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1cb00 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cb10 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1cb20 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1cb30 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1cb40 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cb50 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cb60 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54  ..**.**  (23)  T
1cb70 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74  he parent is not
1cb80 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cb90 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65  , or the sub-que
1cba0 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20  ry is not a.**  
1cbb0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71        compound q
1cbc0 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72  uery. This restr
1cbd0 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1cbe0 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1cbf0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1cc00 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1cc10 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1cc20 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1cc30 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1cc40 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1cc50 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1cc60 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29  t()..**.**  (24)
1cc70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cc80 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1cc90 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
1cca0 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
1ccb0 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
1ccc0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
1ccd0 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
1cce0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
1ccf0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
1cd00 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
1cd10 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
1cd20 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
1cd30 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
1cd40 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
1cd50 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
1cd60 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
1cd70 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
1cd80 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1cd90 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1cda0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1cdb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1cdc0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1cdd0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1cde0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1cdf0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1ce00 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1ce10 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1ce20 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1ce30 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1ce40 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1ce50 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1ce60 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1ce70 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1ce80 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1ce90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1cea0 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1ceb0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1cec0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1ced0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1cee0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1cef0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1cf00 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1cf10 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1cf20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1cf30 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1cf40 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1cf50 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1cf60 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1cf70 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1cf80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cf90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1cfa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1cfb0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1cfc0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1cfd0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1cfe0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1cff0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1d000 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1d010 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1d020 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1d030 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1d040 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d050 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1d060 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d070 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1d080 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1d090 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d0a0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d0b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d0c0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1d0d0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1d0e0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1d0f0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1d100 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1d110 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
1d120 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1d130 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1d140 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1d150 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1d160 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d170 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1d180 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1d190 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1d1a0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1d1b0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1d1c0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1d1d0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d1e0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1d1f0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d200 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d220 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1d230 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1d240 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d250 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1d260 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1d270 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1d280 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1d290 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1d2a0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d2b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d2c0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1d2d0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d2f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d300 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d310 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1d320 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1d330 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1d340 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d350 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1d360 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1d370 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d380 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1d390 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1d3a0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1d3b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1d3c0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1d3d0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1d3e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1d3f0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1d400 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1d410 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1d420 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1d430 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1d440 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d450 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1d460 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1d470 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1d480 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1d490 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1d4a0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1d4b0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1d4c0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1d4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d4e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62  !=0 );.  if( sub
1d4f0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d500 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65    if( isAgg ) re
1d510 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d540 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20  ction (1)   */. 
1d550 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
1d560 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d590 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a  iction (2a)  */.
1d5a0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65      if( (p->pWhe
1d5b0 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  re && ExprHasPro
1d5c0 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c  perty(p->pWhere,
1d5d0 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20  EP_Subquery)).  
1d5e0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1d5f0 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1d600 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71  EList) & EP_Subq
1d610 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c  uery)!=0.     ||
1d620 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1d630 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72  tFlags(p->pOrder
1d640 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  By) & EP_Subquer
1d650 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)!=0.    ){.   
1d660 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d6a0 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20  tion (2b)  */.  
1d6b0 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70    }.  }.    .  p
1d6c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d6d0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d6e0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
1d6f0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
1d700 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
1d710 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
1d720 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
1d730 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
1d740 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
1d750 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
1d760 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1d770 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1d780 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d790 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1d7a0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1d7b0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1d7c0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1d7d0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d7e0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1d7f0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1d800 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1d810 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1d820 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1d830 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1d840 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1d850 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d870 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1d880 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1d890 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1d8a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8c0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1d8d0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1d8e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1d8f0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1d900 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1d910 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d950 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1d960 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1d970 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1d980 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d990 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d9a0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1d9b0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1d9c0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d9d0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d9f0 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1da00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1da10 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1da20 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1da30 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1da40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1da50 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1da60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1da70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1da80 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1da90 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1daa0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1dab0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dac0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1dad0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1dae0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1daf0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1db00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 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 20 20 20 20 20 20                  
1db30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1db40 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1db50 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1db60 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1db70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1db80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1db90 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1dba0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dbb0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1dbc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dbd0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dbe0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1dbf0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dc00 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1dc10 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1dc20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1dc30 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1dc40 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1dc50 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
1dc60 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1dc70 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1dc80 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1dc90 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1dca0 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
1dcb0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1dcc0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1dcd0 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67  sive|SF_MinMaxAg
1dce0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1dcf0 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1dd00 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34  ons (22) and (24
1dd10 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1dd20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dd30 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
1dd40 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1dd50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1dd60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  Restriction (23)
1dd70 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
1dd80 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1dd90 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1dda0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1ddb0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1ddc0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1ddd0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1dde0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1ddf0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1de00 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1de10 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1de20 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1de30 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1de40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1de50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1de60 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1de70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1de80 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1de90 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1dea0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1deb0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1dec0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1ded0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1dee0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1def0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1df00 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1df10 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1df20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1df30 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1df40 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1df50 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1df60 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1df70 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1df80 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1df90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1dfa0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1dfb0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1dfc0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1dfd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1dfe0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1dff0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1e000 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1e010 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e020 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e030 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e050 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e060 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1e070 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1e080 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1e090 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1e0a0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1e0b0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1e0c0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1e0d0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1e0e0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1e0f0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1e100 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1e110 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1e120 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1e130 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1e140 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1e150 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1e160 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e170 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1e180 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1e190 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1e1a0 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1e1b0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1e1c0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e1d0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1e1e0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e1f0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1e200 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1e210 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1e220 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1e230 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1e240 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1e250 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1e260 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1e270 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e280 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1e290 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1e2a0 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1e2b0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1e2c0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1e2d0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1e2e0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1e2f0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1e300 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1e310 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1e320 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1e330 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1e340 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e350 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1e360 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1e370 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e380 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1e390 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1e3a0 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1e3b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e3c0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1e3d0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1e3e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e3f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1e400 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1e410 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1e420 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1e430 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1e440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e450 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e460 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1e470 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1e480 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1e490 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1e4a0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1e4b0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1e4c0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1e4d0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1e4e0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1e4f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e500 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e510 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e520 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1e530 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1e540 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1e550 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1e560 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1e570 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1e580 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1e590 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1e5a0 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1e5b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1e5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1e5d0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1e5e0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1e5f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1e600 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1e610 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1e620 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1e630 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1e640 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1e650 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1e660 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1e670 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1e680 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1e690 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1e6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e6b0 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1e6c0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1e6d0 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1e6e0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1e6f0 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
1e700 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
1e710 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
1e720 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
1e750 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
1e760 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
1e770 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
1e780 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
1e790 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
1e7a0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
1e7b0 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
1e7c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e7d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1e7e0 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
1e7f0 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
1e800 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
1e810 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1e820 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1e830 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
1e840 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e850 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1e860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1e870 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
1e880 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
1e890 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
1e8a0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
1e8b0 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1e8c0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
1e8d0 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
1e8e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1e8f0 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
1e900 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
1e910 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
1e920 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
1e930 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
1e940 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1e950 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
1e960 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
1e970 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
1e980 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
1e990 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
1e9a0 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1e9b0 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1e9c0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1e9d0 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1e9e0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1e9f0 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1ea00 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1ea10 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1ea20 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1ea30 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1ea40 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1ea50 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1ea60 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1ea70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1ea80 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1ea90 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1eaa0 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1eab0 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1eac0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1ead0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1eae0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1eaf0 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1eb00 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1eb10 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1eb20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1eb30 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1eb40 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1eb50 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1eb60 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1eb70 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1eb80 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1eb90 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1eba0 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1ebb0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1ebc0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ebd0 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1ebe0 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1ebf0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ec00 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1ec10 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1ec20 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1ec30 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1ec40 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1ec50 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1ec60 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1ec70 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1ec80 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1ec90 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1eca0 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1ecb0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1ecc0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1ecd0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1ece0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1ecf0 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1ed00 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1ed10 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1ed20 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1ed30 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1ed40 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1ed50 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1ed60 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1ed70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1ed80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1ed90 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1eda0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1edb0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1edc0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1edd0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
1ede0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
1edf0 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
1ee00 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
1ee10 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1ee20 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1ee30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1ee40 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1ee50 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1ee60 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1ee70 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1ee80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1ee90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
1eea0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1eeb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1eec0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
1eed0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
1eee0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
1eef0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1ef00 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1ef10 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
1ef20 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
1ef30 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
1ef40 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
1ef50 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73      ("compound-s
1ef60 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65  ubquery flattene
1ef70 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  r creates %s.%p 
1ef80 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20  as peer\n",.    
1ef90 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e       pNew->zSelN
1efa0 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20  ame, pNew));.   
1efb0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
1efc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1efd0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1efe0 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
1eff0 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
1f000 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1f010 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
1f020 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f030 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
1f040 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
1f050 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
1f060 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
1f070 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1f080 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1f090 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1f0a0 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
1f0b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f0c0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
1f0d0 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
1f0e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f0f0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
1f100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f110 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
1f120 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
1f130 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
1f140 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
1f150 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1f160 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
1f170 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1f180 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
1f190 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
1f1a0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
1f1b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f1c0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f1d0 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
1f1e0 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
1f1f0 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
1f200 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
1f210 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
1f220 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
1f230 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
1f240 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
1f250 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
1f260 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
1f270 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
1f280 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
1f290 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
1f2a0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
1f2b0 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
1f2c0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1f2d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
1f2e0 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
1f2f0 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
1f300 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
1f310 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
1f320 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
1f330 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1f340 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1f350 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1f360 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
1f370 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
1f380 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1f390 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
1f3a0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f3b0 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
1f3c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f3d0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
1f3e0 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
1f3f0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1f400 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
1f410 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
1f420 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1f430 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
1f440 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
1f450 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
1f460 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1f470 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
1f480 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
1f490 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
1f4a0 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
1f4b0 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
1f4c0 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
1f4d0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1f4e0 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
1f4f0 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
1f500 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
1f510 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
1f520 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
1f530 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1f540 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1f550 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
1f560 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f570 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1f580 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1f590 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
1f5a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1f5b0 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
1f5c0 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
1f5d0 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
1f5e0 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1f5f0 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1f600 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
1f610 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
1f620 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
1f630 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
1f640 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
1f650 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
1f660 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
1f670 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
1f680 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
1f690 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
1f6a0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1f6b0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
1f6c0 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
1f6d0 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
1f6e0 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
1f6f0 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
1f700 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
1f710 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
1f720 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
1f730 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
1f740 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
1f750 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1f760 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1f770 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
1f780 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
1f790 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
1f7a0 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
1f7b0 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
1f7c0 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
1f7d0 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
1f7e0 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
1f7f0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1f800 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1f810 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
1f820 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
1f830 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
1f840 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
1f850 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
1f860 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
1f870 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
1f880 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
1f890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f8a0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1f8b0 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1f8c0 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1f8d0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1f8e0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1f8f0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1f900 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f910 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1f920 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1f930 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1f940 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1f950 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1f960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f970 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f980 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1f990 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1f9a0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1f9b0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1f9c0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1f9d0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1f9e0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1f9f0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1fa00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1fa10 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1fa20 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1fa30 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1fa40 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1fa50 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1fa60 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1fa70 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1fa80 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1fa90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1faa0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1fab0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1fac0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1fad0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1fae0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1faf0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1fb00 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1fb10 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1fb20 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1fb30 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1fb40 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1fb50 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1fb60 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1fb70 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1fb80 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1fb90 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
1fba0 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
1fbb0 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
1fbc0 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
1fbd0 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
1fbe0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1fbf0 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
1fc00 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
1fc10 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fc20 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1fc30 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
1fc40 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
1fc50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1fc60 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1fc70 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1fc80 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
1fc90 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
1fca0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1fcb0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
1fcc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fcd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
1fce0 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
1fcf0 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
1fd00 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1fd10 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
1fd20 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
1fd30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1fd40 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
1fd50 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
1fd60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
1fd70 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
1fd80 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
1fd90 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1fda0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1fdb0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1fdc0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1fdd0 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1fde0 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1fdf0 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1fe00 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
1fe10 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
1fe20 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
1fe30 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
1fe40 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
1fe50 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
1fe60 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
1fe70 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
1fe80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1fe90 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
1fea0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1feb0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
1fec0 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
1fed0 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
1fee0 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
1fef0 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1ff00 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1ff20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1ff30 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1ff40 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1ff50 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1ff60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1ff70 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1ff80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ff90 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1ffa0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1ffb0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1ffc0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1ffd0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1ffe0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1fff0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
20000 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
20010 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
20020 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
20030 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
20040 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
20050 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
20060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20070 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
20080 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
20090 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
200a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
200b0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
200c0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
200d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
200e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
200f0 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
20100 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
20110 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
20120 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
20130 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
20140 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
20150 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
20160 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20170 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
20180 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
20190 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
201a0 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
201b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
201c0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
201d0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
201e0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
201f0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
20200 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
20210 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
20220 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
20230 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  erBy ){.      /*
20240 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
20250 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72  any non-zero iOr
20260 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20  derByCol values 
20270 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
20280 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
20290 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65   BY column expre
202a0 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63  ssion is identic
202b0 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72  al to the iOrder
202c0 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a  ByCol'th.      *
202d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  * expression ret
202e0 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
202f0 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20  statement pSub. 
20300 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75  Since these valu
20310 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e  es.      ** do n
20320 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
20330 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c  orrespond to col
20340 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73  umns in SELECT s
20350 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74  tatement pParent
20360 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  ,.      ** zero 
20370 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e  them before tran
20380 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45  sfering the ORDE
20390 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
203a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
203b0 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61  ot doing this ma
203c0 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  y cause an error
203d0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
203e0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
203f0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
20400 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
20410 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  ten a compound s
20420 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50  ub-query into pP
20430 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  arent.      ** (
20440 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69  the only way thi
20450 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20  s can happen is 
20460 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  if the compound 
20470 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20  sub-query is.   
20480 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
20490 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53  part of pSub->pS
204a0 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20  rc). See ticket 
204b0 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a  [d11a6e908f].  *
204c0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
204d0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75   *pOrderBy = pSu
204e0 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
204f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
20500 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
20510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  ++){.        pOr
20520 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
20530 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
20540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
20550 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20560 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
20570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
20580 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
20590 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
205a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
205b0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
205c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
205d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
205e0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
205f0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
20600 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20610 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
20620 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20630 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
20640 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
20650 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
20660 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
20670 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
20680 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
20690 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
206a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
206b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
206c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
206d0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
206e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
206f0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
20700 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
20710 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20720 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
20730 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20740 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
20750 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
20760 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
20770 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20780 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20790 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
207a0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
207b0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
207c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
207f0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
20800 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
20810 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
20820 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
20830 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20840 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
20850 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
20860 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
20870 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
20880 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20890 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
208a0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
208b0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
208c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
208d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
208e0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
208f0 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
20900 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
20910 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
20920 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
20930 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
20940 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
20950 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
20960 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
20970 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
20980 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
20990 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
209a0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
209b0 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
209c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
209d0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
209e0 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
209f0 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
20a00 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
20a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
20a20 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
20a30 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
20a40 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
20a50 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
20a60 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
20a70 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
20a80 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
20a90 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
20aa0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
20ab0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
20ac0 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
20ad0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
20ae0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
20af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
20b00 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
20b10 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
20b20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
20b30 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
20b40 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
20b50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
20b60 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
20b70 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
20b80 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
20b90 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
20ba0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
20bb0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
20bc0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
20bd0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
20be0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
20bf0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
20c00 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
20c10 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
20c20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
20c30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20c40 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
20c50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20c60 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a  OMIT_VIEW) */...
20c70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
20c80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20c90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
20ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
20cb0 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
20cc0 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
20cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
20ce0 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
20cf0 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
20d00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
20d10 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
20d20 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
20d30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
20d40 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
20d50 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
20d60 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
20d70 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
20d80 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
20d90 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
20da0 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
20db0 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
20dc0 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
20dd0 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
20de0 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
20df0 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
20e00 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
20e10 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
20e20 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
20e30 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
20e40 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
20e50 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
20e60 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
20e70 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
20e80 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (1) The inner q
20e90 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
20ea0 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20  gate.  (In that 
20eb0 63 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c  case, we'd reall
20ec0 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20  y want.**       
20ed0 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65  to copy the oute
20ee0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  r WHERE-clause t
20ef0 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41  erms onto the HA
20f00 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  VING clause of t
20f10 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65  he.**       inne
20f20 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 74 68  r query.  But th
20f30 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27  ey probably won'
20f40 74 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20  t help there so 
20f50 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a  do not bother.).
20f60 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20  **.**   (2) The 
20f70 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
20f80 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
20f90 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61  t of a common ta
20fa0 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ble expression..
20fb0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20  **.**   (3) The 
20fc0 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20  inner query has 
20fd0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28  a LIMIT clause (
20fe0 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65  since the change
20ff0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  s to the WHERE.*
21000 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f  *       close wo
21010 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d  uld change the m
21020 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49  eaning of the LI
21030 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  MIT)..**.**   (4
21040 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21050 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
21060 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
21070 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c   JOIN.  (The cal
21080 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66  ler.**       enf
21090 6f 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72  orces this restr
210a0 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69  iction since thi
210b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
210c0 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a  ot have enough.*
210d0 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74  *       informat
210e0 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a  ion to know.).**
210f0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
21100 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
21110 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
21120 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
21130 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
21140 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
21150 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
21160 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
21170 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
21180 65 72 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69  ereTerms(.  sqli
21190 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
211a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
211b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f  e connection (fo
211c0 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20  r malloc()) */. 
211d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
211e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
211f0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
21200 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
21210 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
21220 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
21230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
21240 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
21250 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
21260 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20  /.  int iCursor 
21270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
21280 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
21290 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  e subquery */.){
212a0 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
212b0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
212c0 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
212d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
212e0 28 20 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61  ( (pSubq->selFla
212f0 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61  gs & (SF_Aggrega
21300 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29  te|SF_Recursive)
21310 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
21320 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
21330 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28  ctions (1) and (
21340 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  2) */.  }.  if( 
21350 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
21360 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21370 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
21380 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
21390 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
213a0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
213b0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
213c0 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20  nWhereTerms(db, 
213d0 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
213e0 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b  Right, iCursor);
213f0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
21400 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
21410 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
21420 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
21430 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
21440 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
21450 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
21460 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ubq ){.      pNe
21470 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
21480 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30  up(db, pWhere, 0
21490 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
214a0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e  substExpr(db, pN
214b0 65 77 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75  ew, iCursor, pSu
214c0 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  bq->pEList);.   
214d0 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
214e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
214f0 64 28 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  d(db, pSubq->pWh
21500 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
21510 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
21520 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
21530 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
21540 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
21550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21560 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
21570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21580 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
21590 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
215a0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
215b0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
215c0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2f 0a 23 69  ROM clause.*/.#i
215d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
215e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
215f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
21600 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 76  ITE_OMIT_VIEW).v
21610 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 6e 69 66  oid sqlite3Manif
21620 65 73 74 53 75 62 71 75 65 72 69 65 73 28 0a 20  estSubqueries(. 
21630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21640 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
21650 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21660 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
21670 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
21680 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
21690 20 67 65 6e 65 72 61 74 65 64 20 2a 2f 0a 20 20   generated */.  
216a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
216b0 74 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  t      /* The FR
216c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a  OM clause */.){.
216d0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
216e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
216f0 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
21700 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
21710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
21720 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
21730 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
21740 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
21750 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
21760 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
21770 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
21780 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
21790 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
217a0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
217b0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
217c0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
217d0 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
217e0 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
217f0 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
21800 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
21810 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
21820 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
21830 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
21840 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
21850 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
21860 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
21870 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
21880 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
21890 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
218a0 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
218b0 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
218c0 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
218d0 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
218e0 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
218f0 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
21900 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
21910 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
21920 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
21930 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
21940 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
21950 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
21960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
21970 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
21980 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
21990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
219a0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
219b0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
219c0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
219d0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
219e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
219f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
21a00 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
21a10 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
21a20 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
21a30 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
21a40 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
21a50 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
21a60 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
21a70 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
21a80 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
21a90 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
21aa0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
21ab0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
21ac0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
21ad0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
21ae0 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
21af0 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
21b00 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
21b10 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
21b20 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
21b30 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
21b40 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
21b50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
21b60 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
21b70 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
21b80 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
21b90 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
21ba0 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
21bb0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
21bc0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21bd0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
21be0 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
21bf0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
21c00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
21c10 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
21c20 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
21c30 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 6a 6f    if( (pItem->jo
21c40 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
21c50 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 75  R)==0.     && pu
21c60 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
21c70 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  (db, pSub, p->pW
21c80 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
21c90 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66  rsor).    ){.#if
21ca0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
21cb0 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
21cc0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
21cd0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
21ce0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
21cf0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
21d00 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
21d10 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
21d20 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
21d30 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
21d40 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
21d50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21d60 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
21d70 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
21d80 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
21d90 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ry.    */.    if
21da0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
21db0 3d 3d 31 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==1.     && (p->
21dc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
21dd0 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  l)==0.     && Op
21de0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
21df0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
21e00 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20  qCoroutine).    
21e10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
21e20 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
21e30 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
21e40 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
21e50 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
21e60 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
21e70 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
21e80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21e90 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
21ea0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21eb0 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
21ec0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21ed0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
21ee0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
21ef0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21f00 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
21f10 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21f20 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
21f30 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21f40 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
21f50 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
21f60 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
21f70 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
21f80 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
21f90 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
21fa0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
21fb0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
21fc0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
21fd0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
21fe0 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
21ff0 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
22000 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
22010 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
22020 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
22030 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
22040 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
22050 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
22060 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53  3LogEst(pSub->nS
22070 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
22080 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
22090 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
220a0 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
220b0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
220c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
220d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
220e0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
220f0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
22100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
22110 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
22120 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
22130 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
22140 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
22150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22160 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
22170 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
22180 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
22190 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
221a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
221b0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
221c0 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
221d0 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
221e0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
221f0 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
22200 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
22210 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
22220 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
22230 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
22240 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
22250 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
22260 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
22270 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
22280 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
22290 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
222a0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
222b0 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
222c0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
222d0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
222e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
222f0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
22300 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
22310 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
22320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22330 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
22340 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
22350 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
22360 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
22370 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
22380 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
22390 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
223a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
223b0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
223c0 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
223d0 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
223e0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
223f0 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
22400 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
22410 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
22420 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
22430 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
22440 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
22450 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
22460 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
22470 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
22480 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
22490 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
224a0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
224b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
224c0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
224d0 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
224e0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
224f0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
22500 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
22510 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
22520 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22530 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
22540 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
22550 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
22560 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
22570 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
22580 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
22590 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
225a0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
225b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
225c0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
225d0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
225e0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
225f0 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
22600 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63  Est(pSub->nSelec
22610 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
22620 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
22630 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
22640 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
22650 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
22660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22670 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
22680 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
22690 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
226a0 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
226b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
226c0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
226d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
226e0 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
226f0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
22700 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
22710 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
22720 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
22730 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
22740 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 72 73  break;.    pPars
22750 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
22760 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
22770 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a  eight(p);.  }.}.
22780 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 61  #endif../*.** Ba
22790 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
227a0 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
227b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
227c0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
227d0 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
227e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
227f0 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
22800 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22810 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
22820 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
22830 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
22840 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
22850 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
22860 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22870 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
22880 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
22890 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
228a0 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
228b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
228c0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
228d0 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
228e0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
228f0 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
22900 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
22910 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
22920 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
22930 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
22940 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
22950 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22960 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
22970 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
22980 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
22990 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
229a0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
229b0 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
229c0 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
229d0 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
229e0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
229f0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
22a00 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
22a10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
22a20 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
22a30 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
22a40 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
22a50 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
22a60 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
22a70 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
22a80 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
22a90 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
22aa0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
22ab0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
22ac0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
22ad0 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
22ae0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
22af0 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
22b00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
22b10 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
22b20 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
22b30 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
22b40 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
22b50 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
22b60 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
22b70 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
22b80 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
22b90 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
22ba0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
22bb0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
22bc0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
22bd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22be0 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
22bf0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
22c00 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
22c10 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
22c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
22c30 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
22c40 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
22c50 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
22c60 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
22c70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
22c80 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
22c90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
22ca0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
22cb0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
22cc0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
22cd0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
22ce0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
22cf0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
22d00 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
22d10 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
22d20 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
22d30 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
22d40 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
22d50 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
22d60 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
22d70 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
22d80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22d90 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
22da0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
22db0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
22dc0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
22dd0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
22de0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
22df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
22e00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
22e10 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
22e20 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
22e30 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
22e40 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
22e50 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
22e60 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
22e70 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
22e80 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
22e90 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
22ea0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
22eb0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
22ec0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
22ed0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
22ee0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
22ef0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
22f00 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
22f10 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
22f20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
22f30 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
22f40 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
22f50 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
22f60 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
22f70 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
22f80 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
22f90 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
22fa0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
22fb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22fc0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
22fd0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
22fe0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
22ff0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23000 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
23010 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
23020 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
23030 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
23040 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
23050 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
23060 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
23070 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
23080 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
23090 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
230a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
230b0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
230c0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
230d0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
230e0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
230f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23100 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
23110 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
23120 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
23130 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
23140 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
23150 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
23160 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
23170 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
23180 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
23190 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
231a0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
231b0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
231c0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
231d0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
231e0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
231f0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
23200 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
23210 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
23220 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
23230 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
23240 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
23250 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
23260 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
23270 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
23280 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
23290 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
232a0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
232b0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
232c0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
232d0 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
232e0 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
232f0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
23300 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
23310 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
23320 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 65 64 42 79  From->zIndexedBy
23330 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
23340 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
23350 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
23360 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
23370 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
23380 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
23390 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
233a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
233b0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
233c0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
233d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
233e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
233f0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
23400 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
23410 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
23420 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
23430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23440 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23450 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
23460 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
23470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23480 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
23490 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
234a0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
234b0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
234c0 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
234d0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
234e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
234f0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
23500 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
23510 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
23520 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
23530 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23540 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
23550 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
23560 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
23570 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
23580 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23590 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
235a0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
235b0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
235c0 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
235d0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
235e0 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
235f0 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
23600 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
23610 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
23620 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
23630 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
23640 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
23650 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
23660 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
23670 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
23680 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
23690 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
236a0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
236b0 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
236c0 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
236d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
236e0 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
236f0 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
23700 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
23710 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
23720 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23730 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
23740 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
23750 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
23760 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
23770 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
23780 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
23790 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
237a0 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
237b0 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
237c0 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
237d0 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
237e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
237f0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
23800 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
23810 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
23820 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
23830 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
23840 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
23850 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23860 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23870 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
23880 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
23890 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
238a0 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
238b0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
238c0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
238d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
238e0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
238f0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23900 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
23910 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
23920 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
23930 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
23940 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
23950 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
23960 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23970 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
23980 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
23990 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
239a0 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
239b0 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
239c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
239d0 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
239e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
239f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23a00 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
23a10 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
23a20 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
23a30 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
23a40 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
23a50 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
23a60 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
23a70 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
23a80 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
23a90 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23aa0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
23ab0 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
23ac0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23ad0 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
23ae0 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
23af0 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
23b00 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
23b10 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
23b20 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
23b30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
23b40 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
23b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23b60 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
23b70 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
23b80 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
23b90 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
23ba0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
23bb0 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
23bc0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
23bd0 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
23be0 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
23bf0 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
23c00 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
23c10 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
23c20 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
23c30 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23c40 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
23c50 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
23c60 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
23c70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
23c80 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
23c90 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
23ca0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
23cb0 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
23cc0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
23cd0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
23ce0 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
23cf0 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
23d00 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
23d10 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
23d20 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
23d30 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
23d40 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23d50 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nue;.}..#ifndef 
23d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23d70 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
23d80 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
23d90 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
23da0 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
23db0 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
23dc0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
23dd0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
23de0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
23df0 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
23e00 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
23e10 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
23e20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
23e30 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
23e40 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
23e50 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
23e60 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
23e70 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
23e80 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
23e90 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
23ea0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
23eb0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
23ec0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
23ed0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
23ee0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
23ef0 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
23f00 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
23f10 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
23f20 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
23f30 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
23f40 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f60 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d  * Current outerm
23f70 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
23f80 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
23f90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
23fa0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23fb0 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
23fc0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
23fd0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23ff0 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
24000 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
24010 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
24020 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
24030 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
24040 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
24050 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
24060 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
24070 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
24080 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
24090 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
240a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
240b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
240c0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
240d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
240e0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
240f0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
24100 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
24110 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
24120 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
24130 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
24140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24150 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24160 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
24170 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
24180 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
24190 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
241a0 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
241b0 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
241c0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
241d0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
241e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
241f0 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
24200 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
24210 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24220 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
24230 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
24240 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
24250 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
24260 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
24270 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
24280 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
24290 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
242a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
242b0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
242c0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
242d0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
242e0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
242f0 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
24300 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
24310 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
24320 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
24330 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
24340 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
24350 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
24360 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24370 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
24380 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
24390 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
243a0 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
243b0 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57  =0 || pParse->pW
243c0 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ith==0 );.  if( 
243d0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69  pWith ){.    pWi
243e0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
243f0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
24400 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24410 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
24420 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62  e->bFreeWith = b
24430 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Free;.  }.}../*.
24440 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24450 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
24460 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
24470 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
24480 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
24490 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
244a0 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
244b0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
244c0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
244d0 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
244e0 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
244f0 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
24500 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
24510 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
24520 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
24530 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
24540 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
24550 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
24560 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
24570 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
24580 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
24590 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
245a0 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
245b0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
245c0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
245d0 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
245e0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
245f0 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
24600 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
24610 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
24620 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
24630 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
24640 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24650 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
24660 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
24670 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
24680 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
24690 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
246a0 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
246b0 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
246c0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
246d0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
246e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
246f0 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
24700 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
24710 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
24720 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
24730 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
24740 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24750 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24760 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
24770 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24790 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
247a0 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
247b0 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
247c0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
247d0 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
247e0 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
247f0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
24800 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
24810 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
24820 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
24830 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
24840 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
24850 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
24860 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
24870 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
24880 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
24890 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
248a0 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
248b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
248c0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
248d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
248e0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
248f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24900 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
24910 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
24920 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
24930 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
24940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
24950 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
24960 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
24970 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
24980 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  zErr is non-NULL
24990 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
249a0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
249b0 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
249c0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
249d0 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
249e0 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
249f0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
24a00 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
24a10 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  . If pCte->zErr 
24a20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
24a30 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
24a40 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
24a50 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
24a60 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
24a70 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
24a80 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >zErr ){.      s
24a90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24aa0 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72  Parse, pCte->zEr
24ab0 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  r, pCte->zName);
24ac0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24ad0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
24ae0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
24af0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
24b00 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
24b10 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
24b20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
24b30 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
24b40 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
24b50 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
24b60 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
24b70 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
24b80 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
24b90 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
24ba0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
24bb0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
24bc0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
24bd0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
24be0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
24bf0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
24c00 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
24c10 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
24c20 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
24c30 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
24c40 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
24c50 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
24c60 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
24c70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
24c80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24c90 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
24ca0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24cb0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24cc0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
24cd0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
24ce0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
24cf0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
24d00 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
24d10 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
24d20 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
24d30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
24d40 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
24d50 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
24d60 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
24d70 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
24d80 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
24d90 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
24da0 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
24db0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
24dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
24dd0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24de0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
24df0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
24e00 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
24e10 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
24e20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
24e30 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
24e40 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
24e50 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
24e60 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
24e70 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24e80 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
24e90 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
24ea0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65       pItem->isRe
24eb0 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
24ec0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65         pTab->nRe
24ed0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
24ee0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
24ef0 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
24f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24f10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
24f20 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
24f30 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
24f40 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
24f50 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
24f60 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >2 ){.      sqli
24f70 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
24f80 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22         pParse, "
24f90 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
24fa0 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65  ces to recursive
24fb0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74   table: %s", pCt
24fc0 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e->zName.      )
24fd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24fe0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
24ff0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
25000 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20  Tab->nRef==1 || 
25010 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
25020 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
25030 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20  & pTab->nRef==2 
25040 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
25050 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
25060 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
25070 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
25080 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
25090 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
250a0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73  h = pWith;.    s
250b0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
250c0 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65  (pWalker, bMayRe
250d0 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e  cursive ? pSel->
250e0 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a  pPrior : pSel);.
250f0 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
25100 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
25110 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
25120 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
25130 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
25140 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
25150 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
25160 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
25170 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
25180 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
25190 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
251a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
251b0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
251c0 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
251d0 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
251e0 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
251f0 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
25200 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
25210 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
25220 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
25230 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25240 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
25250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25260 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
25270 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
25280 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
25290 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  .    selectColum
252a0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
252b0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
252c0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
252d0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
252e0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
252f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
25300 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
25310 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
25320 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72        pCte->zErr
25330 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
25340 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25350 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
25360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
25370 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72  e->zErr = "recur
25380 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
25390 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
253a0 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
253b0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
253c0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
253d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
253e0 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  e->zErr = 0;.   
253f0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25400 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d   pSavedWith;.  }
25410 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
25420 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
25430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25440 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66  MIT_CTE./*.** If
25450 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73   the SELECT pass
25460 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
25470 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e   argument has an
25480 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48   associated WITH
25490 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70   .** clause, pop
254a0 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61   it from the sta
254b0 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ck stored as par
254c0 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f  t of the Parse o
254d0 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
254e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
254f0 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63  ed as the xSelec
25500 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c  tCallback2() cal
25510 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69  lback by.** sqli
25520 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
25530 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61  ) when walking a
25540 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20   SELECT tree to 
25550 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a  resolve table.**
25560 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72   names and other
25570 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
25580 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  ments. .*/.stati
25590 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70  c void selectPop
255a0 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
255b0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
255c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
255d0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
255e0 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69  rse;.  With *pWi
255f0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
25600 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
25610 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
25620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
25630 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
25640 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
25650 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
25660 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
25670 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
25680 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
25690 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
256a0 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
256b0 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
256c0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
256d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
256e0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
256f0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
25700 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
25710 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
25720 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
25730 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
25740 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
25750 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
25760 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
25770 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
25780 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
25790 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
257a0 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
257b0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
257c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
257d0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
257e0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
257f0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
25800 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
25810 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
25820 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
25830 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
25840 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25850 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
25860 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
25870 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
25880 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
25890 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
258a0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
258b0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
258c0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
258d0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
258e0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
258f0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
25900 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
25910 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65   up the persiste
25920 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
25930 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
25940 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
25950 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
25960 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
25970 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f  lause to accommo
25980 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
25990 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
259a0 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
259b0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
259c0 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
259d0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
259e0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
259f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
25a00 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
25a10 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
25a20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
25a30 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
25a40 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
25a50 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
25a60 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
25a70 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
25a80 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
25a90 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
25aa0 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
25ab0 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
25ac0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
25ad0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
25ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25af0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
25b00 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
25b10 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
25b20 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
25b30 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
25b40 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
25b50 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
25b60 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
25b70 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
25b80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
25b90 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
25ba0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
25bb0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
25bc0 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
25bd0 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
25be0 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
25bf0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
25c00 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
25c10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25c20 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
25c30 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
25c40 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
25c50 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
25c60 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
25c70 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
25c80 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
25c90 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
25ca0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
25cb0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
25cc0 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53   if( pWalker->xS
25cd0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d  electCallback2==
25ce0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b  selectPopWith ){
25cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68  .    sqlite3With
25d00 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e  Push(pParse, fin
25d10 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
25d20 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  With, 0);.  }.. 
25d30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
25d40 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
25d50 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
25d60 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
25d70 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
25d80 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
25d90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
25da0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
25db0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
25dc0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
25dd0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
25de0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
25df0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
25e00 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
25e10 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
25e20 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
25e30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
25e40 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
25e50 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
25e60 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
25e70 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
25e80 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
25e90 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
25ea0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
25eb0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
25ec0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
25ed0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
25ee0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
25ef0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
25f00 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
25f10 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  From->isRecursiv
25f20 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70  e==0 || pFrom->p
25f30 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Tab );.    if( p
25f40 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  From->isRecursiv
25f50 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
25f60 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
25f70 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
25f80 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
25f90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25fa0 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
25fb0 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
25fc0 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
25fd0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
25fe0 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69  sert( i==0 );.#i
25ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26000 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c 65  T_CTE.      sele
26010 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b 65  ctPopWith(pWalke
26020 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  r, p);.#endif.  
26030 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
26040 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rune;.    }.#ifn
26050 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26060 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
26070 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
26080 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
26090 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
260a0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
260b0 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
260c0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
260d0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
260e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
260f0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
26100 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
26110 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
26120 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
26130 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
26140 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
26150 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26160 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
26170 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26180 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
26190 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
261a0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
261b0 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
261c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
261d0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
261e0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
261f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26200 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
26210 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26220 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26230 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
26240 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
26250 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
26260 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
26270 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
26280 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
26290 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
262a0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
262b0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
262c0 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
262d0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
262e0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
262f0 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
26300 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
26310 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
26320 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
26330 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
26340 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
26350 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
26360 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
26370 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
26380 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
26390 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
263a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263b0 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
263c0 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
263d0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
263e0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
263f0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
26400 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
26410 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
26420 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
26430 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
26440 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
26450 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
26460 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26470 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
26480 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
26490 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
264a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
264b0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
264c0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
264d0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
264e0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
264f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
26500 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
26510 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26520 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26530 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
26540 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
26550 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
26560 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
26570 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
26580 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
26590 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
265a0 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
265b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
265c0 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
265d0 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
265e0 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
265f0 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
26600 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26610 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
26620 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
26630 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26640 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
26650 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
26660 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
26670 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
26680 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
26690 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
266a0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
266b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
266c0 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70  SetName(pFrom->p
266d0 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e  Select, pTab->zN
266e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
266f0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
26700 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
26710 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
26720 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
26730 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
26740 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
26750 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
26760 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
26770 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
26780 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
26790 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
267a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
267b0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
267c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
267d0 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
267e0 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
267f0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
26800 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
26810 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
26820 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
26830 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
26840 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
26850 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26860 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
26870 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
26880 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
26890 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
268a0 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
268b0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
268c0 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
268d0 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
268e0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
268f0 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
26900 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
26910 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
26920 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
26930 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
26940 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
26950 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
26960 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
26970 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
26980 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
26990 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
269a0 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
269b0 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
269c0 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
269d0 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
269e0 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
269f0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
26a00 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
26a10 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
26a20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
26a30 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
26a40 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
26a50 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
26a60 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
26a70 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
26a80 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
26a90 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
26aa0 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
26ab0 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
26ac0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
26ad0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
26ae0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
26af0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
26b00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b10 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26b20 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
26b30 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
26b40 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
26b50 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
26b60 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
26b70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
26b80 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
26b90 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
26ba0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
26bb0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
26bc0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
26bd0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
26be0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
26bf0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
26c00 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
26c10 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
26c20 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
26c30 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
26c40 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
26c50 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
26c60 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
26c70 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
26c80 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
26c90 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
26ca0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
26cb0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
26cc0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
26cd0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
26ce0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
26cf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
26d00 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
26d30 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
26d40 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
26d50 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
26d60 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
26d70 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
26d80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
26d90 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
26da0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26db0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26dc0 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
26dd0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
26de0 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
26df0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
26e00 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
26e10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
26e20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
26e30 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
26e40 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
26e50 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
26e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
26e70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
26e80 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
26e90 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
26ea0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26eb0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
26ec0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26ed0 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
26ee0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
26ef0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
26f00 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
26f10 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
26f20 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
26f30 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
26f40 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
26f50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
26f60 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
26f70 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
26f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26f90 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
26fa0 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
26fb0 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
26fc0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
26fd0 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
26fe0 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
26ff0 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
27000 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
27010 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
27020 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
27030 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
27040 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
27050 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
27060 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
27070 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
27080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
27090 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
270a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
270b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
270c0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
270d0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
270e0 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
270f0 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
27100 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
27110 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
27120 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
27130 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
27140 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
27150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
27160 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
27170 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
27180 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
27190 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
271a0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
271b0 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
271c0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
271d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
271e0 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
271f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
27200 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
27210 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
27220 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
27230 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
27240 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
27250 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
27260 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27270 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27280 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
27290 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
272a0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
272b0 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
272c0 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
272d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
272e0 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
272f0 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
27300 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27340 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
27350 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
27360 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
27370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
27380 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
27390 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
273a0 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
273b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
273c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
273d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
273e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
273f0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
27400 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
27410 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
27420 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
27430 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
27440 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
27450 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
27460 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
27470 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
27480 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
27490 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
274a0 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
274b0 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
274c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
274d0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
274e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
274f0 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
27500 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
27510 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
27520 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
27530 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
27540 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
27550 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
27560 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
27570 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27580 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27590 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
275a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
275b0 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
275c0 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
275d0 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
275e0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
275f0 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
27600 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
27610 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
27620 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
27630 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
27640 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
27650 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27660 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
27670 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
27680 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
27690 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
276a0 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
276b0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
276c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
276d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
276e0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
276f0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
27700 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
27710 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
27720 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
27730 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
27740 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
27760 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
27770 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
27780 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
27790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
277a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
277b0 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
277c0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
277d0 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
277e0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
277f0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
27800 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
27810 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
27820 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27830 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
27860 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
27870 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
27880 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
27890 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
278a0 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
278b0 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
278c0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
278e0 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
278f0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
27900 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27920 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27950 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
27960 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
27970 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
27980 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
27990 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
279a0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
279b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
279c0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
279d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
279e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
279f0 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
27a00 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
27a10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
27a20 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
27a30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27a40 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
27a50 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
27a60 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
27a70 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
27a80 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
27a90 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
27aa0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
27ab0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
27ac0 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
27ad0 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
27ae0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
27af0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
27b00 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
27b10 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ft, pExpr, 0);. 
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27b40 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
27b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
27b60 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
27b70 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
27b80 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
27b90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
27ba0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
27bb0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
27bc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27bd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
27bf0 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
27c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27c10 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
27c20 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
27c30 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
27c40 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
27c50 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20       sColname.z 
27c60 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
27c70 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
27c80 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
27c90 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  en30(zColname);.
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27cb0 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
27cc0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
27cd0 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27cf0 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
27d00 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
27d10 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
27d20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
27d30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27d40 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
27d50 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
27d60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27d70 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
27d80 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
27d90 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
27da0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
27db0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27dd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
27de0 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
27df0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
27e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27e10 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
27e20 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
27e30 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
27e70 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
27e80 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
27e90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27ea0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
27eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27ed0 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
27ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27f10 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
27f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
27f40 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
27f50 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
27f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27f70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27f80 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27f90 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
27fa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
27fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27fc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27fd0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
27fe0 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
27ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28010 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28020 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
28030 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
28040 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
28050 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
28060 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
28070 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
28080 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
28090 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
280a0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
280b0 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
280c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
280d0 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
280e0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
280f0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
28100 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28110 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
28120 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
28130 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
28140 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
28150 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28160 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
28170 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
28180 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28190 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
281a0 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
281b0 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
281c0 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
281d0 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
281e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
281f0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
28200 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28210 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
28220 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28230 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
28240 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
28250 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
28260 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
28270 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
28280 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
28290 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
282a0 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
282b0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
282c0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
282d0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
282e0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
282f0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
28300 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
28310 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
28320 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
28330 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
28340 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
28350 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
28360 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
28370 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
28380 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
28390 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
283a0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
283b0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
283c0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
283d0 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
283e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
283f0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
28400 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
28410 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
28420 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
28430 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28440 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
28450 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
28460 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
28470 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
28480 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
28490 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
284a0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
284b0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
284c0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
284d0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
284e0 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
284f0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
28500 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
28510 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
28520 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
28530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
28540 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
28550 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
28560 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
28570 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
28580 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
28590 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
285a0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
285b0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
285c0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
285d0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
285e0 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
285f0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
28600 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
28610 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
28620 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69  bquery;.    sqli
28630 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
28640 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
28650 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
28660 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
28670 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70 53 65  nder;.  if( (pSe
28680 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
28690 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 29 3d   SF_MultiValue)=
286a0 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  =0 ){.    w.xSel
286b0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
286c0 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
286d0 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  }.  sqlite3WalkS
286e0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
286f0 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
28700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
28710 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
28720 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
28730 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
28740 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
28750 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
28760 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
28770 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
28780 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
28790 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
287a0 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
287b0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
287c0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
287d0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
287e0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
287f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
28800 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
28810 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
28820 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
28830 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
28840 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
28850 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
28860 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
28870 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
28880 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
28890 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
288a0 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
288b0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
288c0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
288d0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
288e0 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
288f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28900 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
28910 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
28920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
28930 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
28940 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
28950 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
28960 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
28970 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
28980 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
28990 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
289a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
289b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
289c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
289d0 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
289e0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
289f0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
28a00 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 ){.    p->selF
28a10 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
28a20 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72  peInfo;.    pPar
28a30 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
28a40 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69  arse;.    pTabLi
28a50 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
28a60 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
28a70 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
28a80 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
28a90 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
28aa0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
28ab0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
28ac0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
28ad0 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
28ae0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
28af0 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
28b00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
28b10 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
28b20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
28b30 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
28b40 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
28b50 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
28b60 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
28b70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sel ){.         
28b80 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
28b90 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
28ba0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
28bb0 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
28bc0 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
28bd0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
28be0 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ab, pSel);.     
28bf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28c00 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
28c10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28c20 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
28c30 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
28c40 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
28c50 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
28c60 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
28c70 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
28c80 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
28c90 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
28ca0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
28cb0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
28cc0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
28cd0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
28ce0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
28cf0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
28d00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
28d10 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
28d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28d30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
28d40 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
28d50 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
28d60 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
28d70 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
28d80 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
28d90 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
28da0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
28db0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
28dc0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
28dd0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
28de0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
28df0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
28e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
28e10 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
28e20 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
28e30 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
28e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
28e50 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
28e60 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
28e70 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
28e80 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
28e90 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
28ea0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
28eb0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
28ec0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
28ed0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
28ee0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
28ef0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
28f00 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
28f10 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
28f20 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
28f30 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
28f40 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
28f50 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
28f60 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
28f70 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
28f80 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
28f90 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
28fa0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
28fb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28fc0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
28fd0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
28fe0 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
28ff0 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
29000 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
29010 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
29020 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
29030 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
29040 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29050 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29060 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29070 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29080 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
29090 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
290a0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
290b0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
290c0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
290d0 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
290e0 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
290f0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
29100 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
29110 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29120 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
29130 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
29140 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
29150 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29160 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
29170 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
29180 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
29190 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
291a0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
291b0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
291c0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
291d0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
291e0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
291f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29200 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
29210 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
29220 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
29230 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
29240 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
29250 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
29260 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
29270 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
29280 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
29290 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
292a0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
292b0 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
292c0 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
292d0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
292e0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
292f0 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
29300 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
29310 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
29320 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
29330 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
29340 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
29350 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
29360 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
29370 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
29380 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
29390 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
293a0 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74  nc *pFunc;.  int
293b0 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f   nReg = pAggInfo
293c0 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e  ->nFunc + pAggIn
293d0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  fo->nColumn;.  i
293e0 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74  f( nReg==0 ) ret
293f0 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  urn;.#ifdef SQLI
29400 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
29410 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67  rify that all Ag
29420 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20  gInfo registers 
29430 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72  are within the r
29440 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62  ange specified b
29450 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d  y.  ** AggInfo.m
29460 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78  nReg..AggInfo.mx
29470 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  Reg */.  assert(
29480 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d   nReg==pAggInfo-
29490 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d  >mxReg-pAggInfo-
294a0 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f  >mnReg+1 );.  fo
294b0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
294c0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
294d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
294e0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
294f0 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
29500 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
29510 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  & pAggInfo->aCol
29520 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
29530 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
29540 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
29550 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29560 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
29570 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29580 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
29590 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
295a0 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
295b0 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  aFunc[i].iMem<=p
295c0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
295d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
295e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
295f0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
29600 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c  pAggInfo->mnReg,
29610 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67   pAggInfo->mxReg
29620 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70  );.  for(pFunc=p
29630 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
29640 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
29650 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
29660 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nc++){.    if( p
29670 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
29680 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
29690 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
296a0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
296b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
296c0 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
296d0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
296e0 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
296f0 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
29700 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
29710 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29720 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
29730 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
29740 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
29750 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
29760 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
29770 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
29780 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
29790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
297a0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
297b0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
297c0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
297d0 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
297e0 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
297f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29800 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
29810 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
29820 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
29830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29840 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
29850 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
29860 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
29870 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
29880 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
29890 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
298a0 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
298b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
298c0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
298d0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
298e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
298f0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
29900 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
29910 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
29920 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
29930 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
29940 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
29950 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
29960 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
29970 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
29980 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
29990 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
299a0 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
299b0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
299c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
299d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
299e0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
299f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
29a00 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
29a10 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29a20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
29a30 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
29a40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
29a50 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
29a60 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
29a70 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
29a80 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
29a90 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
29aa0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
29ab0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
29ac0 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
29ad0 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
29ae0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
29af0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
29b00 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
29b10 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
29b20 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
29b30 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
29b40 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
29b50 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
29b60 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
29b70 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
29b80 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
29b90 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
29ba0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
29bb0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
29bc0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
29bd0 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
29be0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
29bf0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
29c00 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
29c10 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
29c20 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
29c30 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
29c40 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
29c50 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
29c60 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
29c70 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
29c80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29c90 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
29ca0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
29cb0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
29cc0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
29cd0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
29ce0 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
29cf0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
29d00 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
29d10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
29d20 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
29d30 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53  pList, regAgg, S
29d40 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
29d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29d60 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
29d70 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
29d80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
29d90 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
29da0 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
29db0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
29dc0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
29dd0 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d  testcase( nArg==
29de0 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63  0 );  /* Error c
29df0 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ondition */.    
29e00 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
29e10 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20  >1 );   /* Also 
29e20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
29e30 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
29e40 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
29e50 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
29e60 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
29e70 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
29e80 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
29e90 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
29ea0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
29eb0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
29ec0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
29ed0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
29ee0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
29ef0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
29f00 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
29f10 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
29f20 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
29f30 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
29f40 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
29f50 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
29f60 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
29f70 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
29f80 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
29f90 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
29fa0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
29fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29fc0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
29fd0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
29fe0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
29ff0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
2a000 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
2a010 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
2a020 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
2a030 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
2a040 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2a050 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2a060 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
2a070 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
2a080 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
2a090 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
2a0a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a0b0 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
2a0c0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
2a0d0 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
2a0f0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
2a100 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
2a110 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a120 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
2a130 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2a140 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
2a150 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
2a160 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
2a170 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2a180 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2a190 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2a1a0 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
2a1b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2a1c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2a1d0 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
2a1e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a1f0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2a200 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2a210 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
2a220 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
2a230 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
2a240 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
2a250 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
2a260 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
2a270 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
2a280 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
2a290 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
2a2a0 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
2a2b0 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
2a2c0 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
2a2d0 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
2a2e0 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
2a2f0 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
2a300 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
2a310 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
2a320 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
2a330 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
2a340 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
2a350 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
2a360 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
2a370 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
2a380 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
2a390 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
2a3a0 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
2a3b0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
2a3c0 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
2a3d0 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
2a3e0 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
2a3f0 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
2a400 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
2a410 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
2a420 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
2a430 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
2a440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a450 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
2a460 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
2a470 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
2a480 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2a490 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
2a4a0 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
2a4b0 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
2a4c0 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2a4d0 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
2a4e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2a4f0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
2a500 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
2a510 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
2a520 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
2a530 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2a540 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a550 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
2a560 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
2a570 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2a580 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
2a590 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2a5a0 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
2a5b0 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
2a5c0 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
2a5d0 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
2a5e0 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
2a5f0 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
2a600 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
2a610 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2a620 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2a630 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2a640 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2a650 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a670 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
2a680 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
2a690 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
2a6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2a6b0 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
2a6c0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
2a6f0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
2a700 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
2a710 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2a720 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
2a730 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
2a740 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
2a750 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
2a760 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
2a770 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63  x(pIdx)));.    c
2a780 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
2a790 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
2a7a0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
2a7b0 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2a7c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2a7d0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2a7e0 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2a7f0 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2a800 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2a810 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2a820 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
2a830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a840 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2a850 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
2a860 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
2a870 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
2a880 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
2a890 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
2a8a0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
2a8b0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
2a8c0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
2a8d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2a8e0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
2a8f0 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
2a900 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
2a910 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
2a920 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
2a930 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2a940 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
2a950 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
2a960 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
2a970 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
2a980 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
2a990 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2a9a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2a9b0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2a9c0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
2a9d0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
2a9e0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
2a9f0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2aa00 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
2aa10 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
2aa20 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
2aa30 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
2aa40 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
2aa50 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
2aa60 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
2aa70 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2aa80 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
2aa90 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2aaa0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
2aab0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2aac0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2aad0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2aae0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2aaf0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2ab00 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2ab10 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
2ab20 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
2ab30 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2ab40 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
2ab50 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
2ab60 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2ab70 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ab80 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
2ab90 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2aba0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
2abb0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
2abc0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
2abd0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2abe0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2abf0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
2ac00 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
2ac10 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
2ac20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac30 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
2ac40 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
2ac50 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
2ac60 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
2ac70 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
2ac80 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
2ac90 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2aca0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
2acb0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
2acc0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
2acd0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
2ace0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2acf0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
2ad00 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2ad10 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2ad20 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
2ad30 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
2ad40 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2ad50 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
2ad60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
2ad70 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
2ad80 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
2ad90 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
2ada0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2adb0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
2adc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2add0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
2ade0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
2adf0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2ae00 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
2ae10 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
2ae20 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
2ae30 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2ae40 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
2ae50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2ae60 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
2ae70 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
2ae80 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
2ae90 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2aea0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2aec0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
2aed0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
2aee0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2aef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2af00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2af10 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
2af20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2af30 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
2af40 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
2af50 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2af60 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
2af70 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2af80 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
2af90 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
2afa0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
2afb0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
2afc0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
2afd0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
2afe0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
2aff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
2b000 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2b010 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
2b020 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
2b030 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
2b040 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
2b050 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
2b060 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2b070 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
2b080 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
2b090 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2b0a0 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2b0b0 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2b0c0 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
2b0d0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2b0e0 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
2b0f0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
2b100 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
2b110 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2b120 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b130 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b140 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
2b150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2b160 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2b170 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2b180 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
2b190 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2b1a0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b1b0 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
2b1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b1d0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2b1e0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2b1f0 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
2b200 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2b210 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
2b220 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
2b230 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
2b240 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2b250 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
2b260 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2b270 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
2b280 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
2b290 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
2b2a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2b2b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
2b2c0 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
2b2d0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
2b2e0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
2b2f0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2b300 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
2b310 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2b320 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
2b330 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
2b340 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
2b350 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
2b360 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
2b370 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
2b380 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
2b390 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
2b3a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2b3b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
2b3c0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
2b3d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
2b3e0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2b3f0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2b400 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
2b410 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
2b420 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
2b430 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
2b440 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
2b450 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
2b460 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
2b470 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2b480 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2b490 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2b4a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2b4b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2b4c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
2b4d0 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
2b4e0 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
2b4f0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2b500 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c  ate)!=0;.#if SEL
2b510 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2b520 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2b530 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2b540 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2b550 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2b560 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
2b570 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
2b580 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
2b590 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2b5a0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2b5b0 69 66 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  if...  /* If wri
2b5c0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
2b5d0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
2b5e0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
2b5f0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
2b600 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
2b610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b620 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
2b630 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
2b640 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
2b650 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
2b660 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
2b670 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
2b680 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2b690 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72 79  #endif..  /* Try
2b6a0 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
2b6b0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
2b6c0 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74  OM clause up int
2b6d0 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79  o the main query
2b6e0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
2b6f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
2b700 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
2b710 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b720 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
2b730 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
2b740 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2b750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2b760 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b770 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
2b780 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
2b790 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
2b7a0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
2b7b0 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 20   int isAggSub;. 
2b7c0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2b7d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2b7e0 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
2b7f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2b800 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
2b810 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
2b820 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
2b830 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
2b840 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
2b850 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
2b860 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
2b870 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
2b880 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
2b890 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
2b8a0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
2b8b0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2b8c0 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2b8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b8e0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b8f0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2b900 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Src;.    if( db-
2b910 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2b920 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2b930 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
2b940 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2b950 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
2b960 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2b970 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
2b980 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2b990 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68  Get a pointer th
2b9a0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
2b9b0 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63  struction, alloc
2b9c0 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45  ating a new VDBE
2b9d0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65   if one.  ** doe
2b9e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
2b9f0 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ist */.  v = sql
2ba00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2ba10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
2ba20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2ba30 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d;..#ifndef SQLI
2ba40 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
2ba50 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e  _SELECT.  /* Han
2ba60 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  dle compound SEL
2ba70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75  ECT statements u
2ba80 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74  sing the separat
2ba90 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a  e multiSelect().
2baa0 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a    ** procedure..
2bab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
2bac0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rior ){.    rc =
2bad0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
2bae0 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
2baf0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2bb00 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2bb10 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2bb20 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20  eSelectId);.#if 
2bb30 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2bb40 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
2bb50 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
2bb60 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  "end compound-se
2bb70 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c  lect processing\
2bb80 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65  n"));.    pParse
2bb90 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
2bba0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  -;.#endif.    re
2bbb0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2bbc0 64 69 66 0a 0a 20 20 69 66 28 20 21 4f 70 74 69  dif..  if( !Opti
2bbd0 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2bbe0 64 62 2c 20 53 51 4c 49 54 45 5f 4c 61 74 65 53  db, SQLITE_LateS
2bbf0 75 62 71 75 65 72 79 29 20 29 7b 0a 20 20 20 20  ubquery) ){.    
2bc00 2f 2a 20 4d 61 6e 69 66 65 73 74 20 74 68 65 20  /* Manifest the 
2bc10 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 69  subqueries.  Thi
2bc20 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 6f  s needs to be do
2bc30 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ne before callin
2bc40 67 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  g.    ** sqlite3
2bc50 57 68 65 72 65 42 65 67 69 6e 28 29 20 73 6f 20  WhereBegin() so 
2bc60 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 2e 6e  that the Table.n
2bc70 52 6f 77 4c 6f 67 45 73 74 20 76 61 6c 75 65 20  RowLogEst value 
2bc80 63 61 6e 20 62 65 20 73 65 74 0a 20 20 20 20 2a  can be set.    *
2bc90 2a 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  * correctly for 
2bca0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  the subqueries. 
2bcb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  */.    sqlite3Ma
2bcc0 6e 69 66 65 73 74 53 75 62 71 75 65 72 69 65 73  nifestSubqueries
2bcd0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62  (pParse, p, pTab
2bce0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 64  List);.    if( d
2bcf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bd00 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2bd10 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72  d;.  }..  /* Var
2bd20 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66  ious elements of
2bd30 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69   the SELECT copi
2bd40 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  ed into local va
2bd50 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a  riables for.  **
2bd60 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a   convenience */.
2bd70 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2bd80 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d  List;.  pWhere =
2bd90 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
2bda0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2bdb0 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
2bdc0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
2bdd0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2bde0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2bdf0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
2be00 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  0;..#if SELECTTR
2be10 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2be20 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2be30 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2be40 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2be50 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
2be60 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d  "After all FROM-
2be70 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a  clause analysis:
2be80 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2be90 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2bea0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2beb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2bec0 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2bed0 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2bee0 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2bef0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2bf00 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2bf10 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2bf20 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2bf30 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2bf40 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2bf50 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2bf60 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2bf70 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2bf80 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2bf90 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2bfa0 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2bfb0 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
2bfc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
2bfd0 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
2bfe0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2bff0 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2c000 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
2c010 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2c020 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
2c030 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
2c040 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
2c050 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
2c060 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
2c070 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
2c080 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
2c090 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
2c0a0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
2c0b0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
2c0c0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
2c0d0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
2c0e0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
2c0f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
2c100 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
2c110 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
2c120 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
2c130 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
2c140 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
2c150 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2c160 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2c170 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
2c180 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
2c190 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
2c1a0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
2c1b0 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
2c1c0 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
2c1d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2c1e0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2c1f0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2c200 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2c210 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2c220 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
2c230 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
2c240 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
2c250 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
2c260 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
2c270 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
2c280 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
2c290 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
2c2a0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
2c2b0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
2c2c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
2c2d0 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
2c2e0 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
2c2f0 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
2c300 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
2c310 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
2c320 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
2c330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c340 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2c350 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2c360 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
2c370 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
2c380 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
2c390 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
2c3a0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
2c3b0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2c3c0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
2c3d0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2c3e0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
2c3f0 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
2c400 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
2c410 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2c420 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
2c430 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
2c440 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
2c450 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
2c460 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
2c470 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
2c480 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2c490 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
2c4a0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
2c4b0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
2c4c0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2c4d0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
2c4e0 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
2c4f0 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2c500 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2c510 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2c520 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2c530 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c540 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2c550 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2c560 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2c570 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2c580 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2c590 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2c5a0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2c5b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c5c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2c5d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2c5e0 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2c5f0 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2c600 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2c610 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2c620 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2c630 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2c640 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2c650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2c660 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c670 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2c680 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2c690 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2c6a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2c6b0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2c6c0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2c6d0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2c6e0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2c6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c700 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2c710 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2c720 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2c730 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2c740 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2c750 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2c760 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2c770 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
2c780 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47  SelectRow = LARG
2c790 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d  EST_INT64;.  com
2c7a0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
2c7b0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
2c7c0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
2c7d0 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
2c7e0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2c7f0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2c800 56 64 62 65 47 65 74 4f 70 28 76 2c 20 73 53 6f  VdbeGetOp(v, sSo
2c810 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2c820 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53  )->opcode = OP_S
2c830 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73  orterOpen;.    s
2c840 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
2c850 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
2c860 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
2c870 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
2c880 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
2c890 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
2c8a0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
2c8b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c8c0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2c8d0 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2c8e0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2c8f0 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
2c900 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
2c910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2c920 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2c930 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c950 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2c960 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c980 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2c990 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2c9a0 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2c9b0 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
2c9e0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
2c9f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2ca00 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
2ca10 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
2ca20 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2ca30 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2ca40 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
2ca50 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2ca60 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2ca70 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
2ca80 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
2ca90 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
2caa0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
2cab0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
2cac0 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
2cad0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
2cae0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
2caf0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2cb00 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
2cb10 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20  STINCT : 0);..  
2cb20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2cb30 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2cb40 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2cb50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2cb60 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 4c  pParse, p, pTabL
2cb70 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2cb80 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2cbb0 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2cbc0 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2cbd0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2cbe0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2cbf0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2cc00 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2cc10 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2cc20 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2cc30 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2cc40 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2cc50 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2cc60 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2cc70 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2cc80 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2cc90 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2cca0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2ccb0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2ccc0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2ccd0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2cce0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2ccf0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2cd00 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2cd10 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2cd20 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2cd30 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2cd40 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2cd50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2cd60 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2cd70 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2cd80 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2cd90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2cda0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2cdb0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2cdc0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2cdd0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2cde0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2cdf0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2ce00 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2ce10 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2ce20 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2ce30 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2ce40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ce50 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ce60 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2ce70 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2ce80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ce90 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2cea0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ceb0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2cec0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2ced0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2cee0 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2cef0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2cf00 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2cf10 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2cf20 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cf40 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2cf50 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2cf60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cf70 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2cf80 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2cf90 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2cfa0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2cfb0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2cfc0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2cfd0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2cfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2cff0 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2d000 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2d010 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2d020 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2d030 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2d040 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2d050 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2d060 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2d070 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2d080 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2d090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2d0a0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2d0b0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2d0c0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2d0d0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2d0e0 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2d0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2d100 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2d110 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2d120 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2d130 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2d140 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2d150 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2d160 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2d170 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2d180 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2d190 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2d1a0 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2d1b0 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2d1e0 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2d1f0 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2d200 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2d210 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2d220 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2d230 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2d240 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2d250 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2d260 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2d270 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2d280 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2d290 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2d2a0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2d2b0 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2d2c0 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2d2d0 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2d2e0 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2d2f0 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2d300 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2d310 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2d320 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2d330 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2d340 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2d350 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2d360 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2d370 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2d380 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2d390 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2d3a0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2d3b0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2d3c0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2d3d0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2d3e0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2d3f0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2d400 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2d410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d420 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2d430 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2d440 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2d450 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2d460 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2d470 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2d480 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2d490 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2d4a0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2d4b0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2d4c0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2d4d0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2d4e0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2d4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d500 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2d510 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2d520 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2d530 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2d540 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2d550 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2d560 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2d570 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2d580 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2d590 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2d5a0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2d5b0 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2d5c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
2d5d0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2d5e0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2d5f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2d600 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2d610 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2d620 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2d630 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2d640 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2d650 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2d660 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2d670 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2d680 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2d690 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2d6a0 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2d6b0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2d6c0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2d6d0 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
2d6e0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
2d6f0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
2d700 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
2d710 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2d720 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
2d730 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
2d740 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
2d750 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
2d760 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
2d770 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
2d780 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
2d790 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
2d7a0 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
2d7b0 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
2d7c0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
2d7d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2d7e0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2d7f0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
2d800 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
2d810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
2d820 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
2d830 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
2d840 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2d850 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2d860 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2d870 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2d880 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2d890 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2d8a0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2d8b0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2d8c0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2d8d0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2d8e0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2d8f0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2d900 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2d910 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2d920 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2d930 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d940 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2d950 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2d960 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2d970 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2d980 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2d990 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2d9a0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2d9b0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2d9c0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2d9d0 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2d9e0 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2d9f0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2da00 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2da10 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2da20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2da30 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2da40 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2da50 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2da60 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2da70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2da80 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2da90 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2daa0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2dab0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2dac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2dad0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2dae0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2daf0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2db00 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2db10 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2db20 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2db30 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2db40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2db50 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2db60 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2db70 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2db80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2db90 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2dba0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2dbb0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2dbc0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2dbd0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2dbe0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2dbf0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2dc00 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2dc10 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2dc20 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2dc30 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2dc40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2dc50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2dc60 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2dc70 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2dc80 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2dc90 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2dca0 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2dcb0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2dcc0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2dcd0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2dce0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2dcf0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2dd00 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2dd10 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2dd20 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2dd30 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2dd40 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2dd50 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2dd60 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
2dd70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2dd80 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2dd90 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2dda0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2ddb0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2ddc0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2ddd0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2dde0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2ddf0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2de00 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2de10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2de20 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2de30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2de40 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2de50 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2de60 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2de70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2de80 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2de90 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2dea0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2deb0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2dec0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2ded0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2dee0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2def0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2df00 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2df10 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2df20 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2df30 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2df40 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2df50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2df60 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2df70 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2df80 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2df90 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2dfa0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2dfb0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2dfc0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2dfd0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2dfe0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2dff0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2e000 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2e010 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2e020 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2e030 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2e040 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2e050 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2e060 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2e070 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2e080 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2e090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2e0a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2e0b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2e0c0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2e0d0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2e0e0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2e0f0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67  pGroupBy, 0, sAg
2e100 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
2e110 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2e120 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2e130 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2e140 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2e150 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2e160 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2e170 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2e180 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2e190 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2e1a0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2e1b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2e1c0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2e1d0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2e1e0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2e1f0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2e200 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2e210 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2e220 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2e230 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2e240 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2e250 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2e260 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2e270 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2e280 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2e290 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2e2a0 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2e2b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2e2c0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2e2d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2e2e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2e2f0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2e300 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2e310 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2e320 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2e330 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2e340 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2e350 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2e360 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2e370 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2e380 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2e390 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2e3a0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2e3b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2e3c0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2e3d0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2e3e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e3f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2e400 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2e410 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2e420 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2e430 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2e440 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2e450 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2e460 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2e470 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2e480 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2e490 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2e4a0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2e4b0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2e4c0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2e4d0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2e4e0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2e4f0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2e500 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2e510 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2e520 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2e530 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2e540 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2e550 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2e560 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2e570 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2e580 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2e590 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2e5a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2e5b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e5c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2e5d0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2e5e0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2e5f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2e600 67 69 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70  gin(pParse, p, p
2e610 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2e620 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
2e630 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
2e640 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
2e650 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
2e660 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
2e670 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
2e680 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2e690 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2e6a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e6b0 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2e6c0 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
2e6d0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2e6e0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
2e6f0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
2e700 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2e710 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
2e720 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
2e730 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
2e740 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
2e750 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
2e760 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
2e770 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
2e780 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
2e790 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
2e7a0 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
2e7b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e7c0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
2e7d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e7e0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
2e7f0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
2e800 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
2e810 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
2e820 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
2e830 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
2e840 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
2e850 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
2e860 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
2e870 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
2e880 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
2e890 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
2e8a0 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
2e8b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
2e8c0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
2e8d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2e8e0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
2e8f0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
2e900 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2e910 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
2e920 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
2e930 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2e940 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
2e950 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
2e960 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
2e970 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
2e980 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
2e9b0 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
2e9c0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
2e9d0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
2e9e0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2e9f0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2ea00 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
2ea10 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
2ea20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2ea30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2ea40 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2ea50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2ea60 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
2ea70 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
2ea80 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2ea90 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
2eaa0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2eab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eac0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
2ead0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
2eae0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2eaf0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2eb00 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2eb10 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2eb20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2eb30 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2eb40 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2eb50 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
2eb60 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2eb70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
2eb80 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2eb90 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2eba0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2ebb0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
2ebc0 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
2ebd0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
2ebe0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
2ebf0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
2ec00 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2ec10 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
2ec20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ec30 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   r2;..          
2ec40 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
2ec50 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
2ec60 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec80 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
2ec90 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
2eca0 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
2ecb0 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
2ecc0 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20       if( r1!=r2 
2ecd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ece0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ecf0 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
2ed00 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  r2, r1);.       
2ed10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ed20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2ed30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ed40 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20        regRecord 
2ed50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2ed60 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2ed70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
2ed90 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
2eda0 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72  , nCol, regRecor
2edb0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2edc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2edd0 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
2ede0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2edf0 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
2ee00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ee10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
2ee20 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
2ee30 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2ee40 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ee50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2ee60 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
2ee70 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2ee80 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2ee90 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2eea0 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20  ortingIdxPTab = 
2eeb0 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73  sortPTab = pPars
2eec0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2eed0 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c     sortOut = sql
2eee0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2eef0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2ef00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ef10 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
2ef20 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f  do, sortPTab, so
2ef30 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rtOut, nCol);.  
2ef40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ef50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2ef60 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e  rterSort, sAggIn
2ef70 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
2ef80 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  ddrEnd);.       
2ef90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2efa0 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22   "GROUP BY sort"
2efb0 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  )); VdbeCoverage
2efc0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  (v);.        sAg
2efd0 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
2efe0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
2eff0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2f000 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2f010 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f020 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
2f030 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
2f040 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47  le used by the G
2f050 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20  ROUP BY sort.   
2f060 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72     ** will natur
2f070 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77  ally deliver row
2f080 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72  s in the order r
2f090 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f  equired by the O
2f0a0 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a  RDER BY.      **
2f0b0 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20   clause, cancel 
2f0c0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
2f0d0 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65  ble open coded e
2f0e0 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a  arlier..      **
2f0f0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
2f100 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2f110 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
2f120 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
2f130 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
2f140 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68  .      ** Use th
2f150 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
2f160 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
2f170 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f180 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20  OPTIMIZER to .  
2f190 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
2f1a0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2f1b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
2f1c0 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20  poses.  */.     
2f1d0 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20   if( orderByGrp 
2f1e0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2f1f0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2f200 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
2f210 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75  .       && (grou
2f220 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74  pBySort || sqlit
2f230 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
2f240 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29  pWInfo)).      )
2f250 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2f260 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2f270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f280 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2f290 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2f2a0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ndex);.      }..
2f2b0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
2f2c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2f2d0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
2f2e0 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
2f2f0 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
2f300 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
2f310 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
2f320 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
2f330 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
2f340 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
2f350 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
2f360 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
2f370 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
2f380 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
2f390 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
2f3a0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
2f3b0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
2f3c0 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
2f3d0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
2f3e0 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
2f3f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2f400 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2f410 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2f420 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2f430 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2f440 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f450 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2f460 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73  OP_SorterData, s
2f470 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2f480 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f                so
2f4a0 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29  rtOut, sortPTab)
2f4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f4c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
2f4d0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
2f4e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
2f4f0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2f500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2f510 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2f520 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
2f530 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
2f540 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f550 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2f560 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2f570 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f580 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2f590 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
2f5a0 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
2f5b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f5c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2f5d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2f5e0 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
2f5f0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
2f600 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f620 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
2f630 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
2f640 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
2f650 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
2f660 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2f670 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2f680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f690 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
2f6a0 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56  1+1, 0, j1+1); V
2f6b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f6c0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2f6d0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
2f6e0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
2f6f0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
2f700 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
2f710 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
2f720 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
2f730 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
2f740 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
2f750 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
2f760 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
2f770 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
2f780 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
2f790 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
2f7a0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
2f7b0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
2f7c0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
2f7d0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
2f7e0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
2f7f0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
2f800 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
2f810 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
2f820 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
2f830 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2f840 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
2f850 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
2f860 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
2f870 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
2f880 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2f890 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
2f8a0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
2f8b0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
2f8c0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
2f8d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f8e0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2f8f0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2f900 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f910 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f920 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
2f930 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2f940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f950 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
2f960 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
2f970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2f980 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f990 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
2f9a0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2f9b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f9c0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2f9d0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2f9e0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
2f9f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
2fa00 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
2fa10 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
2fa20 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
2fa30 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
2fa40 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
2fa50 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
2fa60 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
2fa70 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
2fa80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2fa90 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
2faa0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2fab0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2fac0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2fad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2fae0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2faf0 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
2fb00 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fb10 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
2fb20 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
2fb30 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2fb40 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
2fb50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2fb60 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2fb70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fb80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fb90 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41  P_SorterNext, sA
2fba0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2fbb0 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
2fbc0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2fbd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2fbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fbf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2fc00 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2fc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2fc20 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
2fc30 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
2fc40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2fc50 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
2fc60 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
2fc70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2fc80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fc90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2fca0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2fcb0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2fcc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2fcd0 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
2fce0 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
2fcf0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
2fd00 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
2fd10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2fd20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fd30 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
2fd40 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
2fd50 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2fd60 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2fd70 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
2fd80 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2fd90 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
2fda0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
2fdb0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
2fdc0 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
2fdd0 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
2fde0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2fdf0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
2fe00 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
2fe10 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
2fe20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
2fe30 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
2fe40 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
2fe50 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
2fe60 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
2fe70 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
2fe80 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
2fe90 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
2fea0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
2feb0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
2fec0 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
2fed0 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
2fee0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
2fef0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
2ff00 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2ff10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ff20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2ff30 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
2ff40 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2ff50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
2ff60 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
2ff70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ff80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2ff90 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2ffa0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
2ffb0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ffc0 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
2ffd0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
2ffe0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2fff0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
30000 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
30010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
30020 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
30030 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
30040 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
30050 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
30060 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30070 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20  nt((v, "Groupby 
30080 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
30090 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
300a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
300b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
300c0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
300d0 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  Row);.      fina
300e0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
300f0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
30100 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
30110 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
30120 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
30130 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
30140 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
30150 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
30160 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
30170 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
30180 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20  -1, &sSort,.    
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
301b0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
301c0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
301d0 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
301e0 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
301f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30200 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
30210 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
30220 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
30230 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
30240 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
30250 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
30260 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
30270 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
30280 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
30290 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
302a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
302b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
302c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
302d0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
302e0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
302f0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
30310 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30320 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
30330 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
30340 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
30350 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
30360 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
30370 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
30380 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
30390 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
303a0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
303b0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
303c0 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20  UNT.      Table 
303d0 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  *pTab;.      if(
303e0 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c   (pTab = isSimpl
303f0 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49  eCount(p, &sAggI
30400 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  nfo))!=0 ){.    
30410 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70      /* If isSimp
30420 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  leCount() return
30430 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
30440 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
30450 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
30460 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
30470 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
30480 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  rm:.        **. 
30490 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
304a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
304b0 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a   <tbl>.        *
304c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
304d0 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  re the Table str
304e0 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
304f0 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65  represents table
30500 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20   <tbl>..        
30510 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
30520 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
30530 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69  so common that i
30540 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73  t is optimized s
30550 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20  pecially. The.  
30560 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e        ** OP_Coun
30570 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
30580 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72   executed either
30590 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74   on the intkey t
305a0 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20  able that.      
305b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
305c0 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65  e data for table
305d0 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65   <tbl> or on one
305e0 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e   of its indexes.
305f0 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   It.        ** i
30600 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63  s better to exec
30610 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e  ute the op on an
30620 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78   index, as index
30630 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20  es are almost.  
30640 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
30650 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65  spread across le
30660 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68  ss pages than th
30670 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
30680 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  g tables..      
30690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
306a0 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  st int iDb = sql
306b0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
306c0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
306d0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
306e0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
306f0 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCsr = pParse->n
30700 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75  Tab++;     /* Cu
30710 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74  rsor to scan b-t
30720 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  ree */.        I
30730 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30750 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
30760 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
30770 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
30780 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69           /* Keyi
307a0 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20  nfo for scanned 
307b0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
307c0 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20   Index *pBest = 
307d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
307e0 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e        /* Best in
307f0 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  dex found so far
30800 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
30810 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e  iRoot = pTab->tn
30820 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
30830 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
30840 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20   scanned b-tree 
30850 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  */..        sqli
30860 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
30870 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
30880 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30890 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
308a0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
308b0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
308c0 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  me);..        /*
308d0 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
308e0 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74  index that has t
308f0 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63  he lowest scan c
30900 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ost..        **.
30910 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31          ** (2011
30920 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64  -04-15) Do not d
30930 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66  o a full scan of
30940 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e   an unordered in
30950 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
30960 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33          ** (2013
30970 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63  -10-03) Do not c
30980 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73  ount the entries
30990 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e   in a partial in
309a0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  dex..        **.
309b0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72          ** In pr
309c0 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e  actice the KeyIn
309d0 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  fo structure wil
309e0 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49  l not be used. I
309f0 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20  t is only .     
30a00 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20     ** passed to 
30a10 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64  keep OP_OpenRead
30a20 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20   happy..        
30a30 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
30a40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
30a50 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33   pBest = sqlite3
30a60 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
30a70 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66  pTab);.        f
30a80 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
30a90 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
30aa0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
30ab0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
30ac0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  x->bUnordered==0
30ad0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
30ae0 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54  Idx->szIdxRow<pT
30af0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20  ab->szTabRow.   
30b00 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
30b10 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d  >pPartIdxWhere==
30b20 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
30b30 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d  (!pBest || pIdx-
30b40 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d  >szIdxRow<pBest-
30b50 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20  >szIdxRow).     
30b60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30b70 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
30b80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ba0 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20  if( pBest ){.   
30bb0 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70         iRoot = p
30bc0 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  Best->tnum;.    
30bd0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
30be0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
30bf0 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
30c00 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Best);.        }
30c10 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
30c20 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
30c30 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68  rsor, execute th
30c40 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73  e OP_Count, clos
30c50 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f  e the cursor. */
30c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30c70 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
30c80 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
30c90 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20  sr, iRoot, iDb, 
30ca0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
30cb0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
30cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30cd0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
30ce0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66   (char *)pKeyInf
30cf0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
30d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30d10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30d20 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
30d30 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e   iCsr, sAggInfo.
30d40 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a  aFunc[0].iMem);.
30d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30d60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30d70 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20  Close, iCsr);.  
30d80 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d        explainSim
30d90 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c  pleCount(pParse,
30da0 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20   pTab, pBest);. 
30db0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
30dc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
30dd0 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20  _BTREECOUNT */. 
30de0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
30df0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
30e00 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
30e10 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30e20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a  forms:.        *
30e30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
30e40 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f  ELECT min(x) FRO
30e50 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
30e60 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
30e70 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
30e80 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30e90 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
30ea0 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
30eb0 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
30ec0 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
30ed0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20  s.        ** as 
30ee0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
30ef0 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
30f00 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
30f10 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
30f20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63     ** If where.c
30f30 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64   is able to prod
30f40 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74  uce results sort
30f50 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
30f60 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
30f70 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
30f80 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
30f90 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
30fa0 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
30fb0 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
30fc0 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
30fd0 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
30fe0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
30ff0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
31000 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70  guaranteed to op
31010 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77  erate on the row
31020 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75   with the minimu
31030 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20  m or maximum .  
31040 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
31050 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
31060 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
31070 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31080 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
31090 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
310a0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
310b0 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
310c0 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tly.        ** m
310d0 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61  odify behavior a
310e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
310f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31100 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72     + If the quer
31110 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d  y is a "SELECT m
31120 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65  in(x)", then the
31130 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20   loop coded by. 
31140 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68         **     wh
31150 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74  ere.c should not
31160 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e   iterate over an
31170 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20  y values with a 
31180 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20  NULL value.     
31190 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e     **     for x.
311a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
311b0 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f      **   + The o
311c0 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e  ptimizer code in
311d0 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68   where.c (the th
311e0 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73  ing that decides
311f0 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
31200 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
31210 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
31220 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
31230 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
31240 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   on .        ** 
31250 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74      satisfying t
31260 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c  he 'ORDER BY' cl
31270 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65  ause than it doe
31280 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73  s in other cases
31290 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  ..        **    
312a0 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
312b0 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
312c0 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
312d0 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
312e0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
312f0 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  *pMinMax = 0;.  
31300 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20        u8 flag = 
31310 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
31320 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20  RMAL;.        . 
31330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31340 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
31350 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31360 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20   flag==0 );.    
31370 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
31380 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ng==0 ){.       
31390 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
313a0 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c  Query(&sAggInfo,
313b0 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20   &pMinMax);.    
313c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
313d0 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c  sert( flag==0 ||
313e0 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20   (pMinMax!=0 && 
313f0 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
31400 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  1) );..        i
31410 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  f( flag ){.     
31420 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
31430 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
31440 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30  p(db, pMinMax, 0
31450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
31460 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
31470 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
31480 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
31490 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
314a0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
314b0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
314c0 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
314d0 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
314e0 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
314f0 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
31500 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
31510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31520 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
31530 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
31540 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
31550 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
31560 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
31570 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
31580 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
31590 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
315a0 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
315b0 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
315c0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
315d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
315e0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
315f0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
31600 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
31610 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
31620 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
31630 70 2c 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  p,pTabList, pWhe
31640 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
31650 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
31660 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
31670 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31680 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
31690 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
316a0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
316b0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
316c0 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
316d0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
316e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
316f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
31700 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
31710 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
31720 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
31730 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
31740 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
31750 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31770 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
31780 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
31790 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
317a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
317b0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
317c0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
317d0 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
317e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
317f0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
31800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31810 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
31820 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
31830 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
31840 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
31850 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
31860 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74    }..      sSort
31870 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
31880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
31890 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
318a0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
318b0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
318c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
318d0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
318e0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
318f0 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
31920 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
31930 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
31940 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
31950 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
31960 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
31970 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
31980 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
31990 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
319a0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
319b0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
319c0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
319d0 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
319e0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
319f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
31a00 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
31a10 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
31a20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
31a30 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
31a40 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
31a50 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
31a60 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
31a70 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
31a80 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
31a90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
31aa0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
31ab0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20  Table(pParse,.  
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ad0 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e     sSort.nOBSat>
31ae0 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20  0 ? "RIGHT PART 
31af0 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52  OF ORDER BY":"OR
31b00 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
31b10 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
31b20 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74  Parse, p, &sSort
31b30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
31b40 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
31b50 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
31b60 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
31b70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
31b80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
31b90 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
31ba0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
31bb0 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65  en coded. If the
31bc0 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
31bd0 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
31be0 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20  cture,.  ** set 
31bf0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
31c00 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  to 1. Otherwise 
31c10 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50  0. */.  rc = (pP
31c20 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a  arse->nErr>0);..
31c30 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
31c40 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
31c50 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
31c60 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
31c70 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
31c80 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
31c90 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
31ca0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
31cb0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
31cc0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
31cd0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
31ce0 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
31cf0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
31d00 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
31d10 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
31d20 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
31d30 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
31d40 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
31d50 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
31d60 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
31d70 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
31d80 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
31d90 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
31da0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31db0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
31dc0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
31dd0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
31de0 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  unc);.#if SELECT
31df0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31e00 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
31e10 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f  arse,p,("end pro
31e20 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
31e30 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
31e40 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  ndent--;.#endif.
31e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.