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

Artifact 1611828a7116e5f6cc1e69cd07d59b0d2c662ea9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74  ral */.  u8 sort
07c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f  Flags;         /
07d0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
07e0: 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a  ORTFLAG_* bits *
07f0: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52  /.};.#define SOR
0800: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
0810: 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53   0x01   /* Use S
0820: 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61  orterOpen instea
0830: 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72  d of OpenEphemer
0840: 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  al */../*.** Del
0850: 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74  ete all the cont
0860: 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20  ent of a Select 
0870: 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c  structure.  Deal
0880: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63  locate the struc
0890: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f  ture.** itself o
08a0: 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20  nly if bFree is 
08b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
08c0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72  lect *p, int bFr
08f0: 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  ee){.  while( p 
0900: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
0910: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
0920: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
0930: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0940: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
0950: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
0970: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  c);.    sqlite3E
0980: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
09a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
09b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ete(db, p->pGrou
09c0: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
09d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
09e0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
09f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0a00: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
0a10: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
0a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0a30: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
0a40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a50: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
0a60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
0a70: 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20  3WithDelete(db, 
0a80: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69  p->pWith);.    i
0a90: 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74  f( bFree ) sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0ab0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ac0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0ae0: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0af0: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0b10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0b20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0b30: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0b40: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0b50: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0b60: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0b70: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0b80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
0b90: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0ba0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0bb0: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0bc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0bd0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0be0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0c00: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0c10: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0c20: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0c60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0c70: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0c80: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0c90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0ca0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0cb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0cc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0cd0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0ce0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0cf0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0d00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0d10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0d20: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0d30: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0d40: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0d50: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0d60: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0d90: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0db0: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0dc0: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0dd0: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0de0: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0df0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0e00: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0e10: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0e20: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0e30: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0e40: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0e50: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0e60: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0e70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0e80: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0e90: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0ea0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0ec0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0ed0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0ee0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0f00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f10: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0f20: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
0f30: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
0f40: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
0f50: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f60: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0f80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0f90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fa0: 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b  TK_ASTERISK,0));
0fb0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0fc0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0fd0: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0ff0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1000: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1010: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1020: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1030: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1040: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1050: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
1060: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
1070: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
1080: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1090: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10a0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10b0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
10c0: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
10d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
10e0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
10f0: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1100: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1110: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
1120: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20  arse->nErr>0 || 
1130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1140: 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 61  !=0 );.  pNew->a
1150: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
1160: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
1170: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
1180: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
1190: 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20  locFailed ) {.  
11a0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
11b0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
11c0: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
11d0: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
11e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
11f0: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1200: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1220: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1230: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1240: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
1250: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1260: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1270: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1280: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1290: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
12a0: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
12b0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
12c0: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
12d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
12e0: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
12f0: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
1300: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
1310: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
1320: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
1330: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
1340: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1350: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1360: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1370: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1380: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1390: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
13a0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
13b0: 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 1);.}../*.** 
13c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
13d0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
13e0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
13f0: 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  ent in a compoun
1400: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c  d..*/.static Sel
1410: 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f  ect *findRightmo
1420: 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  st(Select *p){. 
1430: 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74   while( p->pNext
1440: 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   ) p = p->pNext;
1450: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1460: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f  /*.** Given 1 to
1470: 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20 70   3 identifiers p
1480: 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f 49  receding the JOI
1490: 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72  N keyword, deter
14a0: 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65  mine the.** type
14b0: 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72   of join.  Retur
14c0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  n an integer con
14d0: 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72 65  stant that expre
14e0: 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a  sses that type.*
14f0: 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  * in terms of th
1500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
1510: 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
1520: 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20    JT_INNER.**   
1530: 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20    JT_CROSS.**   
1540: 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20    JT_OUTER.**   
1550: 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20    JT_NATURAL.** 
1560: 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20      JT_LEFT.**  
1570: 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a     JT_RIGHT.**.*
1580: 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a  * A full outer j
1590: 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69  oin is the combi
15a0: 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46  nation of JT_LEF
15b0: 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a  T and JT_RIGHT..
15c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65  **.** If an ille
15d0: 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  gal or unsupport
15e0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20  ed join type is 
15f0: 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c  seen, then still
1600: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69   return.** a joi
1610: 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74 20  n type, but put 
1620: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
1630: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1640: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1650: 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a  JoinType(Parse *
1660: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1670: 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f  A, Token *pB, To
1680: 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20  ken *pC){.  int 
1690: 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
16a0: 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b  Token *apAll[3];
16b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20  .  Token *p;.   
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 30            /*   0
16e0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
16f0: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1700: 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  3 */.  static co
1710: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65 78  nst char zKeyTex
1720: 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65 66  t[] = "naturalef
1730: 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69 6e  touterightfullin
1740: 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74 61  nercross";.  sta
1750: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1760: 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20 20   {.    u8 i;    
1770: 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
1780: 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78 74   of keyword text
1790: 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a   in zKeyText[] *
17a0: 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b 20  /.    u8 nChar; 
17b0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
17c0: 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20 63  the keyword in c
17d0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 20  haracters */.   
17e0: 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a   u8 code;     /*
17f0: 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b 20   Join type mask 
1800: 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b  */.  } aKeyword[
1810: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74  ] = {.    /* nat
1820: 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c  ural */ { 0,  7,
1830: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20 20   JT_NATURAL     
1840: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1850: 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20    /* left    */ 
1860: 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54  { 6,  4, JT_LEFT
1870: 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20  |JT_OUTER       
1880: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74     },.    /* out
1890: 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c  er   */ { 10, 5,
18a0: 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20   JT_OUTER       
18b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
18c0: 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f 20    /* right   */ 
18d0: 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48  { 14, 5, JT_RIGH
18e0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
18f0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c     },.    /* ful
1900: 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c  l    */ { 19, 4,
1910: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
1920: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
1930: 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20    /* inner   */ 
1940: 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 23, 5, JT_INNE
1950: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1960: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f     },.    /* cro
1970: 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c  ss   */ { 28, 5,
1980: 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f   JT_INNER|JT_CRO
1990: 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  SS         },.  
19a0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
19b0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
19c0: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
19d0: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
19e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
19f0: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
1a00: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
1a10: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
1a20: 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  0; j<ArraySize(a
1a30: 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a  Keyword); j++){.
1a40: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d        if( p->n==
1a50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61  aKeyword[j].nCha
1a60: 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  r .          && 
1a70: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1a80: 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b  (char*)p->z, &zK
1a90: 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b  eyText[aKeyword[
1aa0: 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20  j].i], p->n)==0 
1ab0: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
1ac0: 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b  ype |= aKeyword[
1ad0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1af0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1b00: 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31  se( j==0 || j==1
1b10: 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33   || j==2 || j==3
1b20: 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35   || j==4 || j==5
1b30: 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20   || j==6 );.    
1b40: 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65  if( j>=ArraySize
1b50: 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20 20  (aKeyword) ){.  
1b60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1b70: 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  JT_ERROR;.      
1b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1b90: 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69  .  if(.     (joi
1ba0: 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45  ntype & (JT_INNE
1bb0: 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a  R|JT_OUTER))==(J
1bc0: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
1bd0: 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74  ) ||.     (joint
1be0: 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21  ype & JT_ERROR)!
1bf0: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73  =0.  ){.    cons
1c00: 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20  t char *zSp = " 
1c10: 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ";.    assert( p
1c20: 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  B!=0 );.    if( 
1c30: 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20  pC==0 ){ zSp++; 
1c40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
1c50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1c60: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
1c70: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
1c80: 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25 54   ".       "%T %T
1c90: 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a  %s%T", pA, pB, z
1ca0: 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  Sp, pC);.    joi
1cb0: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1cc0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6a  ;.  }else if( (j
1cd0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1ce0: 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ER)!=0 .        
1cf0: 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26 20   && (jointype & 
1d00: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48  (JT_LEFT|JT_RIGH
1d10: 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a  T))!=JT_LEFT ){.
1d20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d30: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1d40: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
1d50: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
1d60: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
1d70: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
1d80: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1d90: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
1da0: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1db0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1dc0: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1dd0: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
1de0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
1df0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
1e00: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1e10: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1e20: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1e30: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1e40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
1e50: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
1e60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
1e70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
1e80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1e90: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
1ea0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1eb0: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1ec0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
1ee0: 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c 65  he first N table
1ef0: 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20  s in pSrc, from 
1f00: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 6c  left to right, l
1f10: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20  ooking for a.** 
1f20: 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20 61  table that has a
1f30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43   column named zC
1f40: 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ol.  .**.** When
1f50: 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69 54   found, set *piT
1f60: 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f  ab and *piCol to
1f70: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65 78   the table index
1f80: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   and column inde
1f90: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63  x.** of the matc
1fa0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  hing column and 
1fb0: 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a  return TRUE..**.
1fc0: 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  ** If not found,
1fd0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
1fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62  /.static int tab
1ff0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2000: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
2010: 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  c,       /* Arra
2020: 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  y of tables to s
2030: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e  earch */.  int N
2040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2050: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62  /* Number of tab
2060: 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  les in pSrc->a[]
2070: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2090: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
20a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72  the column we ar
20b0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
20c0: 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20 20  .  int *piTab,  
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20e0: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
20f0: 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  a[] here */.  in
2100: 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20 20  t *piCol        
2110: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
2120: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69  x of pSrc->a[*pi
2130: 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b  Tab].pTab->aCol[
2140: 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ] here */.){.  i
2150: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2160: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2170: 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
2180: 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  n pSrc */.  int 
2190: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
21a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
21b0: 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f  umn matching zCo
21c0: 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  l */..  assert( 
21d0: 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43  (piTab==0)==(piC
21e0: 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f  ol==0) );  /* Bo
21f0: 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61 72  th or neither ar
2200: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  e NULL */.  for(
2210: 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  i=0; i<N; i++){.
2220: 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d      iCol = colum
2230: 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b 69  nIndex(pSrc->a[i
2240: 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  ].pTab, zCol);. 
2250: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
2260: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54 61  {.      if( piTa
2270: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69  b ){.        *pi
2280: 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Tab = i;.       
2290: 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a   *piCol = iCol;.
22a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
22b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
22c0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
22f0: 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69 65  add terms implie
2300: 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78  d by JOIN syntax
2310: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
2320: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
2330: 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  on of a SELECT s
2340: 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65  tatement. The ne
2350: 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a  w term, which.**
2360: 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20 74   is ANDed with t
2370: 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45 52  he existing WHER
2380: 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66 20  E clause, is of 
2390: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
23a0: 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20     (tab1.col1 = 
23b0: 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a  tab2.col2).**.**
23c0: 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20 74   where tab1 is t
23d0: 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c 65  he iSrc'th table
23e0: 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63   in SrcList pSrc
23f0: 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68 65   and tab2 is the
2400: 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74 68   .** (iSrc+1)'th
2410: 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73  . Column col1 is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74   column iColLeft
2430: 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63 6f   of tab1, and co
2440: 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  l2 is.** column 
2450: 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61 62  iColRight of tab
2460: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
2470: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
2480: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
24b0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
24c0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
24d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
24e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 46  t of tables in F
24f0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2500: 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20 20  int iLeft,      
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
2530: 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20  t table to join 
2540: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2550: 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20   iColLeft,      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2570: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
2580: 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 2a  in first table *
2590: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c 20  /.  int iRight, 
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
25c0: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20  second table in 
25d0: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
25e0: 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  olRight,        
25f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2600: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
2610: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  second table */.
2620: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69    int isOuterJoi
2630: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2640: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2650: 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f  s is an OUTER jo
2660: 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  in */.  Expr **p
2670: 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  pWhere          
2680: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2690: 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  T: The WHERE cla
26a0: 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f  use to add to */
26b0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
26d0: 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20 45    Expr *pE1;.  E
26e0: 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70 72  xpr *pE2;.  Expr
26f0: 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72 74   *pEq;..  assert
2700: 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20 29  ( iLeft<iRight )
2710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2720: 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29 3b  ->nSrc>iRight );
2730: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
2740: 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20 29  >a[iLeft].pTab )
2750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2760: 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61 62  ->a[iRight].pTab
2770: 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c   );..  pE1 = sql
2780: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2790: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
27a0: 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b  Left, iColLeft);
27b0: 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65 33  .  pE2 = sqlite3
27c0: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
27d0: 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67 68  (db, pSrc, iRigh
27e0: 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a  t, iColRight);..
27f0: 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33 50    pEq = sqlite3P
2800: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2810: 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20 30 29  EQ, pE1, pE2, 0)
2820: 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20 69  ;.  if( pEq && i
2830: 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20  sOuterJoin ){.  
2840: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2850: 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f  y(pEq, EP_FromJo
2860: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2870: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2880: 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f  y(pEq, EP_TokenO
2890: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
28a0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
28b0: 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  AProperty(pEq, E
28c0: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
28d0: 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e   pEq->iRightJoin
28e0: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32  Table = (i16)pE2
28f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  ->iTable;.  }.  
2900: 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  *ppWhere = sqlit
2910: 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70  e3ExprAnd(db, *p
2920: 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a  pWhere, pEq);.}.
2930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2940: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2950: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
2960: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2970: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
2980: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
2990: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
29a0: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
29b0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
29c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
29d0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
29e0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
29f0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
2a00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2a10: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2a20: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2a30: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2a40: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2a50: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2a60: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2a70: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2a80: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2a90: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2aa0: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
2ab0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
2ac0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
2ad0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
2ae0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
2af0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
2b00: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2b10: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2b20: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2b30: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2b40: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2b50: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2b60: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2b70: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2b80: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2b90: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2ba0: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
2bb0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
2bc0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
2bd0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
2be0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
2bf0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
2c00: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2c10: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2c30: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2c40: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2c50: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2c60: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2c70: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2c80: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2c90: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2ca0: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
2cb0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2cc0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
2cd0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
2ce0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
2cf0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
2d00: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2d10: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2d20: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2d30: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2d40: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2d50: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2d60: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2d70: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2d80: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2d90: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2da0: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
2db0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
2dc0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
2dd0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
2de0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
2df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e00: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2e10: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2e20: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2e30: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2e40: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2e50: 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  in);.    assert(
2e60: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2e70: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
2e80: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
2e90: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2ea0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
2eb0: 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e  Reduce);.    p->
2ec0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ed0: 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20  = (i16)iTable;. 
2ee0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
2ef0: 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e  _FUNCTION && p->
2f00: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
2f10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
2f20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c  r(i=0; i<p->x.pL
2f30: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2f40: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69  {.        setJoi
2f50: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
2f60: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
2f70: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
2f80: 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e     }.    setJoin
2f90: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
2fa0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
2fb0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
2fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2fd0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
2fe0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
2ff0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
3000: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3010: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3020: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
3030: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
3040: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
3050: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
3060: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
3070: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
3080: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
3090: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
30a0: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
30b0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
30c0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
30d0: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
30e0: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
30f0: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
3100: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
3110: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
3120: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
3130: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
3140: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
3150: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
3160: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
3170: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
3180: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
3190: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
31a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
31b0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
31c0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
31d0: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
31e0: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
31f0: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
3200: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
3210: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
3220: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
3230: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
3240: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3250: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
3260: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3270: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
3280: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
3290: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
32a0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
32d0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
32e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3310: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
3320: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3330: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
3340: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
3350: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
3360: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3370: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
3380: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
3390: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
33a0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
33b0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
33c0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
33d0: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
33e0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
33f0: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
3400: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
3410: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
3420: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
3430: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
3440: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
3450: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20  ->pTab;.    int 
3460: 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66  isOuter;..    if
3470: 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62  ( NEVER(pLeftTab
3480: 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62  ==0 || pRightTab
3490: 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
34a0: 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28  .    isOuter = (
34b0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
34c0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
34d0: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
34e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
34f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3500: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3510: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3520: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3530: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3540: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3550: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3560: 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f  f( pRight->fg.jo
3570: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
3580: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
3590: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
35a0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
35b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
35d0: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
35e0: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
35f0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
3600: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3610: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
3620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3630: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
3640: 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e  ; j<pRightTab->n
3650: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3660: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3670: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c    /* Name of col
3680: 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74  umn in the right
3690: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
36a0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
36b0: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66   /* Matching lef
36c0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
36d0: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
36e0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f    /* Matching co
36f0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74  lumn in the left
3700: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20   table */..     
3710: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68     zName = pRigh
3720: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
3730: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
3740: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
3750: 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20  ndex(pSrc, i+1, 
3760: 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26  zName, &iLeft, &
3770: 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20  iLeftCol) ){.   
3780: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
3790: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63  erm(pParse, pSrc
37a0: 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f  , iLeft, iLeftCo
37b0: 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20  l, i+1, j,.     
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
37e0: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
37f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3800: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
3810: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3820: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
3830: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
3840: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3850: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
3860: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3870: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3880: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3890: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
38a0: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
38b0: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
38c0: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
38d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
38e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
38f0: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
3900: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
3910: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
3920: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
3930: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
3940: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
3950: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
3960: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
3970: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
3980: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
3990: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
39a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
39b0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
39c0: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
39d0: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
39e0: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
39f0: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
3a00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3a10: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
3a20: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
3a30: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
3a40: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
3a50: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3a60: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
3a70: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
3a80: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
3a90: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
3aa0: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
3ab0: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
3ac0: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
3ad0: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
3ae0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
3af0: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
3b00: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
3b10: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
3b20: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
3b30: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
3b40: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
3b50: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
3b60: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
3b70: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3b80: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3b90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3ba0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3bb0: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3bc0: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3bd0: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3be0: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3bf0: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3c00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3c10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c20: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53  e term in the US
3c30: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
3c40: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b        int iLeft;
3c50: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
3c60: 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68  on the left with
3c70: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
3c90: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3ca0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3cb0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3cc0: 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66  olumn on the lef
3cd0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  t */.        int
3ce0: 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a   iRightCol;   /*
3cf0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3d00: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3d10: 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  n on the right *
3d20: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3d30: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a   = pList->a[j].z
3d40: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52  Name;.        iR
3d50: 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e  ightCol = column
3d60: 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c  Index(pRightTab,
3d70: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3d80: 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30   if( iRightCol<0
3d90: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61  .         || !ta
3da0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3db0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3dc0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3dd0: 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29  ftCol).        )
3de0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
3df0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3e00: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
3e10: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
3e20: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
3e30: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
3e40: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
3e50: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
3e60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3e70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3e80: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3e90: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ea0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3eb0: 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a  i+1, iRightCol,.
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70       isOuter, &p
3ee0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
3ef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
3f00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46  eturn 0;.}../* F
3f10: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3f20: 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e   */.static KeyIn
3f30: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
3f40: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
3f50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3f60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
3f70: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3f80: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
3f90: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
3fa0: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
3fb0: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
3fc0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
3fd0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
3fe0: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
3ff0: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
4000: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
4010: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4020: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
4030: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
4040: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
4050: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
4060: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
4070: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65   in registers re
4080: 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68  gData.** through
4090: 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31   regData+nData-1
40a0: 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   onto the sorter
40b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
40c0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
40d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
40e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
40f0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4100: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4110: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4120: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
4130: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
4140: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
4150: 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  elect,       /* 
4160: 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54  The whole SELECT
4170: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4180: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20  int regData,    
4190: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
41a0: 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
41b0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
41c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
41d0: 72 69 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f  rigData,       /
41e0: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
41f0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65   holding data be
4200: 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a  fore packing */.
4210: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
4220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4230: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4240: 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61 79  n the data array
4250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
4260: 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  xReg         /* 
4270: 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72  No. of reg prior
4280: 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61 69   to regData avai
4290: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f  lable for use */
42a0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
42b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75         /* Stmt u
42e0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
42f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20  n */.  int bSeq 
4300: 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  = ((pSort->sortF
4310: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
4320: 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a  UseSorter)==0);.
4330: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53    int nExpr = pS
4340: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
4350: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
4360: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44     /* No. of ORD
4370: 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20  ER BY terms */. 
4380: 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78   int nBase = nEx
4390: 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74  pr + bSeq + nDat
43a0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
43b0: 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73    /* Fields in s
43c0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
43d0: 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73     /* Regs for s
4410: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a  orter record */.
4420: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
4430: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20     /* Assembled 
4460: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4470: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4480: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20  pSort->nOBSat;  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20      /* ORDER BY 
44b0: 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f  terms to skip */
44c0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
44f0: 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72 65  to add sorter re
4500: 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a  cord to sorter *
4510: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
4520: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
4530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61  );.  assert( nDa
4540: 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61  ta==1 || regData
4550: 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 20 29 3b  ==regOrigData );
4560: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
4570: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
4580: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78   nPrefixReg==nEx
4590: 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72  pr+bSeq );.    r
45a0: 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61  egBase = regData
45b0: 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b   - nExpr - bSeq;
45c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
45d0: 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
45e0: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50  nMem + 1;.    pP
45f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42  arse->nMem += nB
4600: 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ase;.  }.  sqlit
4610: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4620: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4630: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
4640: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
4650: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4660: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
4670: 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
4680: 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 20 20  TE_ECEL_REF);.  
4690: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
46a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46b0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
46c0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
46d0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
46e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
46f0: 65 66 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20  efixReg==0 ){.  
4700: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4710: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4720: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
4730: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
4740: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
4750: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4760: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4770: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4780: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4790: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
47a0: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
47b0: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
47c0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
47d0: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
47e0: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
47f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4800: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4810: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
4820: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
4830: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
4840: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4850: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4860: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4870: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4880: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4890: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
48a0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
48b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
48c0: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
48d0: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
48e0: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
48f0: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4900: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4910: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4920: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4930: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4940: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4950: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4960: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4970: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4980: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4990: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
49a0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
49b0: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
49c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
49d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
49e0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
49f0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4a00: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a20: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4a30: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4a40: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4a50: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4a60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4a70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4a80: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4a90: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4aa0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4ab0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4ac0: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4ad0: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4ae0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4af0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4b00: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4b10: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4b20: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4b30: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4b40: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4b50: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4b60: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
4b70: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4b80: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4b90: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4ba0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4bb0: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4bc0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4bd0: 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e   testcase( pKI->
4be0: 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20 20  nXField>2 );.   
4bf0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4c00: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4c10: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4c20: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4c30: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64      pKI->nXField
4c70: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4c80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4c90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cb0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4cc0: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4cd0: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4ce0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4cf0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4d00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4d10: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4d20: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4d30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4d40: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
4d50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
4d60: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
4d70: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
4d80: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
4d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4da0: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
4db0: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
4dc0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4dd0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4de0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
4df0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4e00: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4e10: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
4e20: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
4e30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4e40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4e50: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
4e60: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
4e70: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4e80: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
4e90: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
4ea0: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
4eb0: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
4ec0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
4ed0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4ee0: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
4ef0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
4f00: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
4f10: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
4f20: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
4f30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4f40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4f50: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4f60: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4f70: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
4f80: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4f90: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
4fb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4fc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
4fd0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 30 2c  Zero, iLimit, 0,
4fe0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
4ff0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
5000: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5010: 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69  P_Last, pSort->i
5020: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
5030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5040: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53  v, OP_Delete, pS
5050: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
5060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5070: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5080: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5090: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
50a0: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
50b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
50c0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
50d0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
50e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
50f0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
5100: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
5110: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5120: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5130: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5140: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5150: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5160: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5170: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5180: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
51a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
51b0: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
51c0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
51d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
51e0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
51f0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
5200: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
5210: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5220: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5230: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5240: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5250: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5260: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5270: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5280: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5290: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
52a0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
52b0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
52c0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
52d0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
52e0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
52f0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
5300: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
5310: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5320: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5330: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5340: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5350: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5360: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5370: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5390: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
53a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
53b0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
53c0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
53d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
53e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
53f0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5400: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5410: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5420: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5430: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5440: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5450: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5460: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5480: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5490: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
54a0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
54b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
54c0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
54d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
54e0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
54f0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5500: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5510: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5520: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5530: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5540: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5550: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5560: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5570: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5580: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5590: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
55a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62  _IdxInsert, iTab
55b0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
55c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
55d0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
55e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
55f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
5600: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
5610: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
5620: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
5630: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
5640: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
5650: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
5660: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
5670: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
5680: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
5690: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
56a0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
56b0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
56c0: 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64  e the error used
56d0: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20   to occur.** in 
56e0: 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e  multiple places.
56f0: 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c    (The error onl
5700: 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20  y occurs in one 
5710: 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77  place now, but w
5720: 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20  e.** retain the 
5730: 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69  subroutine to mi
5740: 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72  nimize code disr
5750: 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74  uption.).*/.stat
5760: 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d  ic int checkForM
5770: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
5780: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
5790: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
57a0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20   Parse context. 
57b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
57c0: 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73  *pDest,   /* Des
57d0: 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45  tination of SELE
57e0: 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  CT results */.  
57f0: 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20  int nExpr       
5800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5810: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5820: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
5830: 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ECT */.){.  int 
5840: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
5850: 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70  Dest;.  if( nExp
5860: 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53  r>1 && (eDest==S
5870: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
5880: 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20  =SRT_Set) ){.   
5890: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
58a0: 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61  (pParse, "only a
58b0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61   single result a
58c0: 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20  llowed for ".   
58d0: 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68      "a SELECT th
58e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
58f0: 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
5900: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5910: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5920: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
5930: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5940: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5950: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5960: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5970: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5980: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5990: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
59a0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
59b0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
59c0: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
59d0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
59e0: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
59f0: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5a00: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5a10: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5a20: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5a30: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5a40: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5a50: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62   .** to get numb
5a60: 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  er columns and t
5a70: 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20  he datatype for 
5a80: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5a90: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5aa0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ac0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5ad0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ae0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5b00: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5b10: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5b20: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
5b30: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
5b40: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
5b50: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
5b60: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
5b70: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
5b80: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
5b90: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
5ba0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
5bb0: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ort,         /* 
5bc0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
5bd0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
5be0: 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ess ORDER BY */.
5bf0: 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70    DistinctCtx *p
5c00: 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20  Distinct, /* If 
5c10: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
5c20: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
5c30: 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53   DISTINCT */.  S
5c40: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5c50: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
5c60: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
5c70: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5c80: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
5c90: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
5ca0: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
5cb0: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
5cc0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
5cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
5ce0: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
5cf0: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
5d00: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
5d10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5d20: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
5d30: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
5d40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
5d50: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
5d60: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
5d70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ent */.  int reg
5d80: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
5d90: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
5da0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
5db0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
5dc0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
5dd0: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
5de0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5df0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
5e00: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
5e10: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
5e20: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
5e30: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
5e40: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
5e50: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
5e60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5e70: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
5e80: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
5e90: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5ea0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
5eb0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
5ec0: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20   regResult */.. 
5ed0: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
5ee0: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5ef0: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
5f00: 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f  ct = pDistinct ?
5f10: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
5f20: 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49  tType : WHERE_DI
5f30: 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69  STINCT_NOOP;.  i
5f40: 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72  f( pSort && pSor
5f50: 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
5f60: 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66   pSort = 0;.  if
5f70: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68  ( pSort==0 && !h
5f80: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
5f90: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69    assert( iConti
5fa0: 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f  nue!=0 );.    co
5fb0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
5fc0: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5fd0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
5fe0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
5ff0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
6000: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45   nResultCol = pE
6010: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
6020: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
6030: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
6040: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  Sort ){.      nP
6050: 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74  refixReg = pSort
6060: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
6070: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70  r;.      if( !(p
6080: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
6090: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
60a0: 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52  rter) ) nPrefixR
60b0: 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  eg++;.      pPar
60c0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65  se->nMem += nPre
60d0: 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  fixReg;.    }.  
60e0: 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
60f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
6100: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6110: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6120: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
6130: 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c  st->iSdst+nResul
6140: 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e  tCol > pParse->n
6150: 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Mem ){.    /* Th
6160: 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63  is is an error c
6170: 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61  ondition that ca
6180: 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78  n result, for ex
6190: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45  ample, when a SE
61a0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  LECT.    ** on t
61b0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
61c0: 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20  de of an INSERT 
61d0: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65  contains more re
61e0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
61f0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61  n.    ** there a
6200: 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  re columns in th
6210: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  e table on the l
6220: 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20  eft.  The error 
6230: 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20  will be caught. 
6240: 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74     ** and report
6250: 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77  ed later.  But w
6260: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
6270: 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ure enough memor
6280: 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20  y is allocated. 
6290: 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f     ** to avoid o
62a0: 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72  ther spurious er
62b0: 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e  rors in the mean
62c0: 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  time. */.    pPa
62d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
62e0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70  sultCol;.  }.  p
62f0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52  Dest->nSdst = nR
6300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52  esultCol;.  regR
6310: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
6320: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
6330: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
6340: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
6350: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6360: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6370: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6380: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
6390: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
63a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
63b0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
63c0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
63d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
63e0: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
63f0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
6400: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
6410: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
6420: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
6430: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
6440: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
6450: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
6460: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
6470: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
6480: 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ags;.    if( eDe
6490: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
64a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
64b0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
64c0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
64d0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
64e0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
64f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6500: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
6510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6520: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6530: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
6540: 20 72 65 67 52 65 73 75 6c 74 2c 20 30 2c 20 65   regResult, 0, e
6550: 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  celFlags);.  }..
6560: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
6570: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
6580: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
6590: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
65a0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
65b0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
65c0: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
65d0: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
65e0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
65f0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
6600: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
6610: 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  ct ){.    switch
6620: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
6630: 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ctType ){.      
6640: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
6650: 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
6660: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
6670: 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op;            /
6680: 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * No longer requ
6690: 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72  ired OpenEphemer
66a0: 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20  al instr. */.   
66b0: 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20       int iJump; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66d0: 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
66e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
66f0: 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
6700: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
6710: 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  row content */..
6720: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
6730: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
6740: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
6750: 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65  /.        regPre
6760: 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
6770: 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  +1;.        pPar
6780: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
6790: 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ultCol;..       
67a0: 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f   /* Change the O
67b0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
67c0: 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f  coded earlier to
67d0: 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20   an OP_Null.    
67e0: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
67f0: 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20  MEM_Cleared bit 
6800: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67  on the first reg
6810: 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20  ister of the.   
6820: 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
6830: 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69   value.  This wi
6840: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f  ll cause the OP_
6850: 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61  Ne below to alwa
6860: 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  ys.        ** fa
6870: 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  il on the first 
6880: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
6890: 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68   loop even if th
68a0: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
68b0: 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55  ** row is all NU
68c0: 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  LLs..        */.
68d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
68e0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
68f0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6900: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6910: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
6920: 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74  beGetOp(v, pDist
6930: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6940: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
6950: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
6960: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
6970: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 1;.        pOp
6980: 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a  ->p2 = regPrev;.
6990: 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d  .        iJump =
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
69b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65  entAddr(v) + nRe
69c0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20  sultCol;.       
69d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
69e0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
69f0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6a00: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
6a10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
6a20: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
6a30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
6a40: 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74     if( i<nResult
6a50: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Col-1 ){.       
6a60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp3(v, OP_Ne,
6a80: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a   regResult+i, iJ
6a90: 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  ump, regPrev+i);
6aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
6ab0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6ac0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6ad0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6ae0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6af0: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
6b00: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
6b10: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6b20: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6b30: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
6b50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6b60: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
6b70: 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50   char *)pColl, P
6b80: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ba0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
6bb0: 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
6bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
6bd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
6be0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6bf0: 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73  ==iJump || pPars
6c00: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6c10: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  led );.        s
6c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c30: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
6c40: 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c  Result, regPrev,
6c50: 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a   nResultCol-1);.
6c60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6c70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61       }..      ca
6c80: 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
6c90: 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
6ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6cb0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6cc0: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6cd0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ct);.        bre
6ce0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
6cf0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
6d10: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6d20: 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
6d30: 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a  CT_UNORDERED );.
6d40: 20 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74          codeDist
6d50: 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69  inct(pParse, pDi
6d60: 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c  stinct->tabTnct,
6d70: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73   iContinue, nRes
6d80: 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ultCol,.        
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6da0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
6db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6dc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
6dd0: 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ort==0 ){.      
6de0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
6df0: 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
6e00: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nue);.    }.  }.
6e10: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
6e20: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
6e30: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
6e40: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
6e50: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
6e60: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
6e70: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
6e80: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
6e90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6ea0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
6eb0: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
6ec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
6ed0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
6ee0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6ef0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
6f00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6f20: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6f30: 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20  ltCol, r1);.    
6f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f50: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6f60: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
6f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6f80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6f90: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
6fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6fb0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
6fc0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
6fd0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
6fe0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
6ff0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
7000: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
7010: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
7020: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
7030: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
7040: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
7050: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
7060: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
7070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7090: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
70a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
70b0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
70c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
70d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
70e0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
70f0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
7100: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
7110: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
7120: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
7130: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
7140: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
7150: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
7160: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
7170: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
7180: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
7190: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
71a0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
71b0: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
71c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
71d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
71e0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
71f0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7200: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
7210: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7220: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
7230: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7240: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
7250: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
7260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7270: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7280: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7290: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
72a0: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
72b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
72c0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
72d0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
72e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
72f0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
7300: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
7310: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
7320: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
7330: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
7340: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
7350: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
7360: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
7370: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
7380: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
7390: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
73a0: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
73b0: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
73c0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
73d0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
73e0: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
73f0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
7400: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
7410: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
7420: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
7430: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
7440: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7450: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
7460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7470: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
7480: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
7490: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
74a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
74b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
74c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
74d0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
74e0: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
74f0: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7500: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7510: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7520: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7530: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7540: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7550: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
7560: 72 65 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65  regResult,1,nPre
7570: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
7580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7590: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
75a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
75b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
75d0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
75e0: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
75f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7600: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7610: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
7620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7630: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
7640: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7650: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
7660: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7670: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
7680: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
7690: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
76a0: 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65  pParse, r1, nPre
76b0: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
76c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
76d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
76e0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
76f0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
7700: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
7710: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
7720: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
7730: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
7740: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
7750: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
7760: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
7770: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
7780: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
7790: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
77a0: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
77b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
77c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
77d0: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
77e0: 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
77f0: 61 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20  affSdst =.      
7800: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7810: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
7820: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
7830: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
7840: 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66  fSdst);.      if
7850: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7860: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
7870: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
7880: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
7890: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
78a0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
78b0: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
78c0: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
78d0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
78e0: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
78f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
7900: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
7910: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
7920: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
7930: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
7940: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
7950: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
7960: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7970: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7980: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
7990: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
79a0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
79b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
79c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
79d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
79e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
79f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7a00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7a10: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7a20: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7a30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7a40: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
7a50: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
7a60: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
7a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7a80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a90: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7aa0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7ab0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7ac0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7af0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7b00: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7b10: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7b20: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7b30: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7b40: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
7b50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7b60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7b70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
7b80: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
7b90: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7ba0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7bb0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7bc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7bd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7be0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7bf0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7c00: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7c10: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7c20: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7c30: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7c40: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7c50: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7c60: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7c70: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7c80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7c90: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7ca0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7cb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7cc0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cd0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7ce0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7cf0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 52 65  regResult, regRe
7d00: 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78  sult, 1, nPrefix
7d10: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7d20: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7d30: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50  t( regResult==iP
7d40: 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  arm );.        /
7d50: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
7d60: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
7d70: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
7d80: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
7d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7da0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
7db0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7dc0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
7dd0: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
7de0: 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65  ine:       /* Se
7df0: 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d  nd data to a co-
7e00: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63  routine */.    c
7e10: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
7e20: 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  {        /* Retu
7e30: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  rn the results *
7e40: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
7e50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7e60: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7e70: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7e80: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
7e90: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7ea0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
7eb0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7ec0: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
7ed0: 73 75 6c 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  sult, regResult,
7ee0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b      nPrefixReg);
7f10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7f20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7f30: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
7f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f50: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7f60: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
7f70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
7fa0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
7fb0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7fd0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7fe0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7ff0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8000: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
8010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8020: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8030: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
8040: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
8050: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
8060: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
8070: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
8080: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
8090: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
80a0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
80b0: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
80c0: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
80d0: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
80e0: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
80f0: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
8100: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
8110: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
8120: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
8130: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
8140: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
8150: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
8160: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
8170: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
8180: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
8190: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
81a0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
81b0: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
81c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
81d0: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
81e0: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
81f0: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
8200: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
8210: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
8220: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
8230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
8240: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
8250: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
8260: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
8270: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
8280: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
8290: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
82a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
82b0: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
82c0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
82d0: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
82e0: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
82f0: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
8300: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8310: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
8320: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
8330: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
8340: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
8350: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
8360: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
8370: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
8380: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
8390: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
83a0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
83b0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
83c0: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
83d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
83e0: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
83f0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8400: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8410: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8440: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8450: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8460: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8490: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
84a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
84b0: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
84c0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
84d0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
84e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
84f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8500: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8510: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8520: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8530: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8540: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8550: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8560: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8570: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8580: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8590: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
85c0: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
85d0: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8620: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8630: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8650: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8660: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8670: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
8680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8690: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
86a0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
86b0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
86c0: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
86d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
86e0: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
86f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8700: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8720: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8730: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
8740: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
8750: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8760: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8770: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
8780: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8790: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
87a0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
87b0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
87c0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
87d0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
87e0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
87f0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
8800: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
8810: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
8820: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
8830: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
8840: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
8850: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
8860: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
8870: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
8880: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
8890: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
88a0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
88b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
88c0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
88d0: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
88e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
88f0: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
8900: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8910: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
8920: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
8930: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
8940: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
8950: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
8960: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
8970: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
8980: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
8990: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
89a0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
89b0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
89c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
89d0: 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
89e0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
89f0: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
8a00: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
8a10: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
8a20: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8a30: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
8a40: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
8a50: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
8a60: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
8a70: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
8a80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
8a90: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
8aa0: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
8ab0: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
8ac0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8ad0: 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (0, .           
8ae0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b          sizeof(K
8af0: 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a  eyInfo) + (N+X)*
8b00: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
8b10: 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29  )+1));.  if( p )
8b20: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
8b30: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
8b40: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
8b50: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
8b60: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c  N;.    p->nXFiel
8b70: 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20  d = (u16)X;.    
8b80: 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
8b90: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  ;.    p->db = db
8ba0: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
8bb0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8bc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8bd0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
8be0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
8bf0: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
8c00: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
8c10: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
8c20: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
8c30: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8c40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8c50: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8c60: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8c70: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
8c80: 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b  te3DbFree(0, p);
8c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8ca0: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8cb0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8cc0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8cd0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8ce0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8cf0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8d00: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8d10: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
8d20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8d30: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
8d40: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
8d50: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
8d60: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8d70: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
8d80: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
8d90: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
8da0: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
8db0: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
8dc0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
8dd0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
8de0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8df0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
8e00: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8e10: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
8e20: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
8e30: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
8e40: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
8e50: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
8e60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8e70: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
8e80: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
8e90: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
8ea0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
8eb0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
8ec0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
8ed0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8ee0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8ef0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
8f00: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8f10: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8f20: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8f30: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8f40: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
8f50: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
8f60: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
8f70: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
8f80: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
8f90: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
8fa0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
8fb0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
8fc0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
8fd0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
8fe0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
8ff0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
9000: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
9010: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9020: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9030: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9040: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9050: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9060: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9070: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9080: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9090: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
90a0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
90b0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
90c0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
90d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
90e0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
90f0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9100: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9110: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9120: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9130: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9140: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9150: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9160: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9170: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9180: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9190: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
91a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
91b0: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
91c0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
91d0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
91e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
91f0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9200: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9210: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9220: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9230: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9240: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9250: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9260: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9280: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9290: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
92a0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
92b0: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
92c0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
92d0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
92e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
92f0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9300: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9310: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9320: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9330: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9340: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9350: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9360: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9370: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9380: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9390: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
93a0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
93b0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
93c0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
93d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
93e0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
93f0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9400: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9410: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9420: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9430: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9440: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9450: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9460: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9470: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9480: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9490: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
94a0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
94b0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
94c0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
94d0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
94e0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
94f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9500: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9510: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9530: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9540: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9560: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9570: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9590: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
95a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
95b0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
95c0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
95d0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
95e0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
95f0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9600: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9610: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9620: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
9630: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
9640: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
9650: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
9660: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
9670: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
9680: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9690: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
96a0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
96b0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
96c0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
96d0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
96e0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
96f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9700: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9710: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9720: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
9730: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
9740: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
9750: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
9760: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
9770: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
9780: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9790: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
97a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
97b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
97c0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
97d0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
97e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
97f0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9800: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9810: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9820: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
9840: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
9850: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
9860: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
9870: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
9880: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9890: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
98a0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
98b0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
98c0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
98d0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
98e0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
98f0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9900: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9910: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9920: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
9930: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9940: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
9950: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
9960: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
9970: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
9980: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9990: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
99a0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
99b0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
99c0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
99d0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
99e0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
99f0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9a00: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9a10: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9a20: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
9a30: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
9a40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9a50: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
9a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9a70: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9a80: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9a90: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9aa0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9ab0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9ac0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9ad0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9ae0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9af0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9b00: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9b10: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9b20: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9b30: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
9b40: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
9b50: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
9b60: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9b70: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
9b80: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9b90: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9ba0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9bb0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9bc0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9bd0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9be0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9bf0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9c00: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9c10: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9c20: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9c30: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9c40: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9c50: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9c60: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9c70: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9c80: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9c90: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9ca0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9cb0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9cc0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9cd0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9ce0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9cf0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9d00: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9d10: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9d20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9d30: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9d70: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9da0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9db0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
9dc0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9de0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9df0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9e20: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9e30: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9e50: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9e60: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9e70: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
9e80: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
9e90: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
9ea0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
9eb0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
9ec0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9ed0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9ee0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9ef0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9f00: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9f10: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9f20: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9f30: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9f40: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9f50: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9f60: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9f70: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
9f80: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
9f90: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
9fa0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9fb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9fc0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9fd0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9fe0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9ff0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a000: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a010: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
a020: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
a030: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
a040: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
a050: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
a060: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
a070: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
a080: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
a090: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
a0a0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
a0b0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
a0c0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
a0d0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
a0e0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
a0f0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
a100: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
a110: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
a120: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
a130: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
a140: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
a150: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
a160: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
a170: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
a180: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a190: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a1a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a1b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a1c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a1d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a1e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a1f0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a200: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a210: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a220: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a230: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a240: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a250: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a260: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a270: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a280: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a290: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a2a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a2b0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a2d0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a2e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a2f0: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
a300: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a310: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
a320: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a330: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a340: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a350: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a360: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a370: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a380: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a390: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a3a0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a3b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a3c0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a3d0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a3e0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a3f0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a400: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a410: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a420: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a430: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a440: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a460: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a470: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a480: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a4b0: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a4c0: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a4d0: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a500: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a510: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a520: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a530: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a540: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a550: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a560: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a570: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a580: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a590: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a5a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a5b0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a5c0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a5d0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a5e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a5f0: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
a600: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
a610: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a620: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
a630: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
a640: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
a650: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
a660: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a670: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
a680: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72  routine ){.    r
a690: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
a6a0: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
a6b0: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
a6c0: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
a6d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a6e0: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
a6f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a700: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
a710: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a720: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a730: 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20  nSortData = 1;. 
a740: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
a750: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
a760: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
a770: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
a780: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
a790: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
a7a0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
a7b0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a7c0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
a7d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
a7e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
a7f0: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a800: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
a810: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
a820: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
a830: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
a840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a850: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
a860: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
a870: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
a880: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
a890: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
a8a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a8b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
a8c0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
a8d0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a8e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a8f0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
a900: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
a910: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a920: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a930: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a940: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a960: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
a970: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
a980: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
a990: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
a9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a9b0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a9c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a9d0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a9e0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a9f0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
aa00: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
aa10: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
aa20: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
aa30: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
aa40: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
aa50: 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74  (i=0; i<nSortDat
aa60: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  a; i++){.    sql
aa70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa80: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
aa90: 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71  rtTab, nKey+bSeq
aaa0: 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  +i, regRow+i);. 
aab0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
aac0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
aad0: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
aae0: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
aaf0: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
ab00: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
ab10: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
ab20: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
ab30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
ab50: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
ab60: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
ab70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab80: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
ab90: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
aba0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
abb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
abc0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
abd0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
abe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
abf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ac00: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
ac10: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
ac20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ac30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ac40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ac50: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ac60: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
ac70: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
ac90: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
aca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
acb0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
acc0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
acd0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
ace0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
acf0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
ad00: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
ad10: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
ad20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ad30: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
ad40: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
ad50: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
ad60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
ad70: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
ad80: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
ad90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
ada0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
adb0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
adc0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
add0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ade0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
adf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ae00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ae10: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
ae20: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
ae30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ae40: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
ae50: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
ae60: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
ae70: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ae80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ae90: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
aea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aeb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
aec0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
aed0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
aee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aef0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
af00: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
af10: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
af20: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
af30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
af40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
af50: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
af60: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
af70: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
af80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
af90: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
afa0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
afb0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
afc0: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
afd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
afe0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
aff0: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  d);.  }.  /* The
b000: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
b010: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
b020: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b030: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
b040: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
b050: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
b060: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
b070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b080: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b090: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
b0a0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
b0b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
b0c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
b0d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b0e0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
b0f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b100: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
b110: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
b120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b130: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
b140: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
b150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b160: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b170: 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f  addrBreak);.}../
b180: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
b190: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
b1a0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
b1b0: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
b1c0: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
b1d0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
b1e0: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
b1f0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
b200: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
b210: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
b220: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
b230: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
b240: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
b250: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
b260: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
b270: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
b280: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b290: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
b2a0: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
b2b0: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
b2c0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
b2d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b2e0: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
b2f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b300: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
b310: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b320: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
b330: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
b340: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
b350: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
b360: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b370: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
b380: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
b390: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
b3a0: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
b3b0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
b3c0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
b3d0: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
b3e0: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
b3f0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b400: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
b410: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
b420: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
b430: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
b440: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b450: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b460: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b470: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
b480: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
b490: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
b4a0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
b4b0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b4c0: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
b4d0: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
b4e0: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
b4f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b500: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
b510: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
b520: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
b530: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b540: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
b550: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b560: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
b570: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
b580: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
b590: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b5a0: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
b5b0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b5c0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b5d0: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
b5e0: 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a  ,D,E,F).#else /*
b5f0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
b600: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b610: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
b620: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b630: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b640: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b650: 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61  ,B,F).#endif.sta
b660: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b670: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b680: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b690: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b6a0: 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pr,.#ifdef SQLIT
b6b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b6c0: 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74  METADATA.  const
b6d0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b6e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b6f0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b700: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b710: 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75  gCol,.#endif.  u
b720: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
b730: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
b740: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  ype = 0;.  int j
b750: 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20  ;.  u8 estWidth 
b760: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
b770: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b780: 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72  _METADATA.  char
b790: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
b7a0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b7b0: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
b7c0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b7d0: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e  OrigCol = 0;.#en
b7e0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
b7f0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
b800: 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
b810: 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63  st!=0 );.  switc
b820: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b830: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
b840: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
b850: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
b860: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b870: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b880: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
b890: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
b8a0: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
b8b0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b8c0: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
b8d0: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
b8e0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
b8f0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
b900: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
b910: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
b920: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
b930: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
b940: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
b950: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
b960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
b970: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b980: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
b990: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
b9a0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b9b0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b9c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
b9d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
b9e0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
b9f0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
ba00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ba10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
ba20: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
ba30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ba40: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
ba50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
ba60: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
ba70: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
ba80: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
ba90: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
baa0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
bab0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
bac0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
bad0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
bae0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
baf0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
bb00: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
bb10: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
bb20: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
bb30: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
bb40: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
bb50: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
bb60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
bb70: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
bb80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
bba0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
bbb0: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
bbc0: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
bbd0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
bbe0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
bbf0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
bc00: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
bc10: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
bc20: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
bc30: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
bc40: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
bc50: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
bc60: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
bc70: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
bc80: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
bc90: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
bca0: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
bcb0: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
bcc0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
bcd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
bce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
bcf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
bd00: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
bd10: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
bd20: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
bd30: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
bd40: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
bd50: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
bd60: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
bd70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
bd80: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
bd90: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
bda0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
bdb0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
bdc0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
bdd0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
bde0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
bdf0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
be00: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
be10: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
be20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
be30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
be40: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
be50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
be60: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
be70: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
be80: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
be90: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
bea0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
beb0: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
bec0: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
bed0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
bee0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
bef0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
bf00: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
bf10: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
bf20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bf30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
bf40: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
bf50: 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62  Expr->pTab==pTab
bf60: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
bf70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
bf80: 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63  he "table" is ac
bf90: 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c  tually a sub-sel
bfa0: 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e  ect or a view in
bfb0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
bfc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
bfd0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
bfe0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
bff0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c000: 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20   and origin.    
c010: 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20      ** data for 
c020: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63  the result-set c
c030: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62  olumn of the sub
c040: 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20  -select..       
c050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c060: 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59  iCol>=0 && ALWAY
c070: 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  S(iCol<pS->pELis
c080: 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
c090: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
c0a0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
c0b0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
c0c0: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
c0d0: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
c0e0: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
c0f0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
c100: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
c110: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
c120: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
c130: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
c140: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
c150: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
c160: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  LL..          **
c170: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
c180: 65 20 41 4c 57 41 59 53 28 29 20 69 73 20 62 65  e ALWAYS() is be
c190: 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53 2d 3e  cause iCol>=pS->
c1a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 77 69  pEList->nExpr wi
c1b0: 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20  ll have been.   
c1c0: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67 68 74         ** caught
c1d0: 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61 6d 65   already by name
c1e0: 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20   resolution..   
c1f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c200: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c210: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
c220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c230: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
c240: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
c250: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c260: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
c270: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
c280: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c290: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c2a0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
c2b0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
c2c0: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
c2d0: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
c2e0: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
c2f0: 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  th); .        }.
c300: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c310: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
c320: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
c330: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
c340: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
c350: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c360: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
c370: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
c380: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
c390: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
c3a0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
c3b0: 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53  Col) );.#ifdef S
c3c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c3d0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
c3e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c400: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c410: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
c420: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
c430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c440: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c450: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c460: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c470: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
c480: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
c490: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  me;.          es
c4a0: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c4b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c4c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
c4e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
c4f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
c500: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
c510: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
c520: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
c530: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
c540: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
c550: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44            zOrigD
c560: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
c570: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
c580: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
c590: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
c5a0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c5b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c5c0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c5d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c5e0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
c5f0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
c600: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c610: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c620: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c630: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
c640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c650: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c660: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c670: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
c680: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c690: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c6a0: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
c6b0: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
c6c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c6d0: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
c6e0: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
c6f0: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
c700: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c710: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
c720: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
c730: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
c740: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c750: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
c760: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
c770: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
c780: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c790: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c7a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c7b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c7c0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
c7d0: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
c7e0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c7f0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
c800: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c810: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c820: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c830: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c840: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c850: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
c860: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
c870: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
c880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c890: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
c8a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c8b0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c8c0: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
c8d0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c8e0: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
c8f0: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
c900: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
c910: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
c920: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
c930: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
c940: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
c950: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
c960: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
c970: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
c980: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
c990: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c9a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
c9b0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
c9c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c9d0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
c9e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c9f0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
ca00: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
ca10: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
ca20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
ca30: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ca40: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
ca50: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ca60: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
ca70: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ca80: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ca90: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
caa0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
cab0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cac0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
cad0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
cae0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
caf0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
cb00: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
cb10: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
cb20: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
cb30: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
cb40: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
cb50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
cb60: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
cb70: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
cb80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
cb90: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
cba0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
cbb0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
cbc0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
cbd0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
cbe0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
cbf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cc00: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
cc10: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
cc20: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
cc30: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
cc40: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
cc50: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
cc60: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
cc70: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
cc80: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
cc90: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
cca0: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
ccb0: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
ccc0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
ccd0: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
cce0: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
ccf0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
cd00: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
cd10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cd20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cd30: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
cd40: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
cd50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
cd60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cd70: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cd80: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
cd90: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cda0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cdb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cdc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
cdd0: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
cde0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cdf0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
ce00: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
ce10: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
ce20: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ce40: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ce50: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
ce60: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
ce70: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
ce80: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ce90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
cea0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TYPE) */.}../*.*
ceb0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cec0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
ced0: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
cee0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
cef0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cf00: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
cf10: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
cf20: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
cf30: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
cf40: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
cf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
cf60: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
cf70: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
cf80: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
cf90: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
cfa0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
cfb0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
cfc0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
cfd0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
cfe0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
cff0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
d000: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
d010: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d020: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
d030: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
d040: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d050: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
d060: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
d070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d080: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
d090: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
d0a0: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
d0b0: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
d0c0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
d0d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d0e0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
d0f0: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
d100: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
d110: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45  olNamesSet || NE
d120: 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d  VER(v==0) || db-
d130: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
d140: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
d150: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
d160: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
d170: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
d180: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
d190: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
d1a0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
d1b0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
d1c0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
d1d0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
d1e0: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
d1f0: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
d200: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
d210: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d220: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
d230: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
d240: 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  r;.    if( NEVER
d250: 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  (p==0) ) continu
d260: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
d270: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
d280: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
d290: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
d2a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
d2b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d2c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d2d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
d2e0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d2f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
d300: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
d310: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d320: 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
d330: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
d340: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
d350: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
d360: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
d370: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
d380: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
d390: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
d3a0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
d3b0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
d3c0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
d3d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d3e0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
d3f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
d400: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
d410: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
d420: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
d430: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
d440: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
d450: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
d460: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
d470: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
d480: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
d490: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
d4a0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
d4b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d4c0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
d4d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
d4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d4f0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
d500: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
d510: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d520: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d530: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d540: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
d550: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d560: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
d570: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
d580: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
d590: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
d5a0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
d5b0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
d5c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
d5d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
d5e0: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
d5f0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
d600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d610: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d620: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d630: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
d640: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
d650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d660: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d670: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d680: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
d690: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d6a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d6b0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
d6c0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
d6d0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
d6e0: 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
d6f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
d700: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
d710: 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
d720: 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
d730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d740: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d750: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
d760: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
d780: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
d790: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
d7a0: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
d7b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
d7c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
d7d0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
d7e0: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
d7f0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
d800: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
d810: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
d820: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
d830: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
d840: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
d850: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
d860: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
d870: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
d880: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
d890: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
d8a0: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
d8b0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
d8c0: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
d8d0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
d8e0: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
d8f0: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
d900: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
d910: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
d920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
d930: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
d940: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
d950: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
d960: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
d970: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
d980: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
d990: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d9a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d9b0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
d9c0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
d9d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
d9e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d9f0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
da00: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
da10: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
da20: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
da30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
da40: 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
da60: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
da70: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
da80: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
da90: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
daa0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
dab0: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
dac0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
dad0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
dae0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
daf0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
db00: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
db10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
db20: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
db30: 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20  u32 cnt;        
db40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
db50: 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
db60: 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
db70: 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
db80: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
db90: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
dba0: 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
dbb0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
dbc0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
dbd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dbe0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
dbf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
dc00: 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20  /.  Expr *p;    
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
dc30: 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  r a single resul
dc40: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
dc50: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
dc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
dc70: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
dc80: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
dc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
dca0: 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
dcb0: 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68  me[] */.  Hash h
dcc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dcd0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
dce0: 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ble of column na
dcf0: 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  mes */..  sqlite
dd00: 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a  3HashInit(&ht);.
dd10: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
dd20: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
dd30: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
dd40: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
dd50: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
dd60: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
dd70: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
dd80: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
dd90: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
dda0: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
ddb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ddc0: 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20  nCol==(i16)nCol 
ddd0: 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43  );.  *pnCol = nC
dde0: 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61  ol;.  *paCol = a
ddf0: 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c  Col;..  for(i=0,
de00: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
de10: 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ol && !db->mallo
de20: 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43  cFailed; i++, pC
de30: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
de40: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
de50: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
de60: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
de70: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
de80: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
de90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
dea0: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
deb0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
dec0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
ded0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
dee0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
def0: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
df00: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
df10: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
df20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
df30: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
df40: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
df50: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
df60: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
df70: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
df80: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
df90: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
dfa0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
dfb0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
dfc0: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
dfd0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
dfe0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78  {.        pColEx
dff0: 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  pr = pColExpr->p
e000: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
e010: 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21  ssert( pColExpr!
e020: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
e030: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
e040: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
e050: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
e060: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
e070: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
e080: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
e090: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
e0a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
e0b0: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
e0c0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
e0d0: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
e0e0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
e0f0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e100: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e110: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e120: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
e130: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
e140: 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  e : "rowid";.   
e150: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
e160: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
e170: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
e180: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
e190: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
e1a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
e1b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
e1c0: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
e1d0: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
e1e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
e1f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
e200: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
e210: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
e220: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
e230: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
e240: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
e250: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
e260: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
e270: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
e280: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
e290: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
e2a0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
e2b0: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
e2c0: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
e2d0: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
e2e0: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
e2f0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
e300: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
e310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20  .    */.    cnt 
e320: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
e330: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
e340: 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e  HashFind(&ht, zN
e350: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
e360: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e370: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e380: 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65  .      if( nName
e390: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
e3a0: 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30  r(j=nName-1; j>0
e3b0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67   && sqlite3Isdig
e3c0: 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d  it(zName[j]); j-
e3d0: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
e3e0: 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29   zName[j]==':' )
e3f0: 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20   nName = j;.    
e400: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
e410: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e420: 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20  (db, "%.*z:%u", 
e430: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  nName, zName, ++
e440: 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
e450: 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f  cnt>3 ) sqlite3_
e460: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
e470: 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20  f(cnt), &cnt);. 
e480: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
e490: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
e4a0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
e4b0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
e4c0: 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20  e(0, pCol);.    
e4d0: 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  if( zName && sql
e4e0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
e4f0: 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29  ht, zName, pCol)
e500: 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==pCol ){.      
e510: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e520: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e530: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
e540: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
e550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e560: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
e570: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e580: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e590: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
e5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e5b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
e5c0: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
e5d0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
e5e0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e5f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e610: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e620: 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  Add type and col
e630: 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
e640: 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c  on to a column l
e650: 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ist based on.** 
e660: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e670: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63  nt..** .** The c
e680: 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75  olumn list presu
e690: 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20  mably came from 
e6a0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65  selectColumnName
e6b0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e  sFromExprList().
e6c0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e6d0: 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d  ist has only nam
e6e0: 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72  es, not types or
e6f0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68   collations.  Th
e700: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f  is.** routine go
e710: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61  es through and a
e720: 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e  dds the types an
e730: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a  d collations..**
e740: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e750: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61   requires that a
e760: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  ll identifiers i
e770: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
e780: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
e790: 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  olved..*/.static
e7a0: 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43   void selectAddC
e7b0: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
e7c0: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
e7d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
e7e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e7f0: 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ts */.  Table *p
e800: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
e810: 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65   Add column type
e820: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
e830: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
e840: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
e850: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
e860: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
e870: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
e880: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
e890: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e8a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
e8b0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
e8c0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
e8d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
e8e0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
e8f0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
e900: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75  ist_item *a;.  u
e910: 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20  64 szAll = 0;.. 
e920: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
e930: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e940: 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c   (pSelect->selFl
e950: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
e960: 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  d)!=0 );.  asser
e970: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70  t( pTab->nCol==p
e980: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e990: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
e9a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
e9b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e9c0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
e9d0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
e9e0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
e9f0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
ea00: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
ea10: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
ea20: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
ea30: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
ea40: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
ea50: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ea60: 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
ea70: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  pr;.    if( pCol
ea80: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ->zType==0 ){.  
ea90: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
eaa0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
eab0: 70 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  p(db, .         
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
ead0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
eae0: 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e  p,0,0,0, &pCol->
eaf0: 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20  szEst));.    }. 
eb00: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
eb10: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
eb20: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
eb30: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
eb40: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
eb50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
eb60: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
eb70: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
eb80: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  OB;.    pColl = 
eb90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
eba0: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
ebb0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
ebc0: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29  pCol->zColl==0 )
ebd0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
ebe0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
ebf0: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
ec00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
ec10: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
ec20: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
ec30: 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a  Est(szAll*4);.}.
ec40: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
ec50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
ec60: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
ec70: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
ec80: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
ec90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
eca0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
ecb0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
ecc0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ecd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
ece0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
ecf0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
ed00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ed10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
ed20: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
ed30: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
ed40: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
ed50: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
ed60: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
ed70: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
ed80: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
ed90: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
eda0: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
edb0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
edc0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
edd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
ede0: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
edf0: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
ee00: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
ee10: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
ee20: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
ee30: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
ee40: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
ee50: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
ee60: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ee70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ee80: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
ee90: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
eea0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
eeb0: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
eec0: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
eed0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
eee0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
eef0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
ef00: 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ==0 );.  pTab->n
ef10: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
ef20: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
ef30: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
ef40: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
ef50: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
ef60: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73  (1048576) );.  s
ef70: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
ef80: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
ef90: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
efa0: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
efb0: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
efc0: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
efd0: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
efe0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
eff0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
f000: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
f010: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f020: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
f030: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
f040: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
f050: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
f060: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
f070: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
f080: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
f090: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
f0a0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
f0b0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
f0c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f0d0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
f0e0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
f0f0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
f100: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
f110: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
f120: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
f130: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f140: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
f150: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
f160: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
f170: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
f180: 0a 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c  .    if( v ) sql
f190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
f1a0: 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20  , OP_Init);.    
f1b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
f1c0: 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26  level==0.     &&
f1d0: 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
f1e0: 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
f1f0: 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
f200: 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20  Const).    ){.  
f210: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
f220: 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20  nstFactor = 1;. 
f230: 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75     }..  }.  retu
f240: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
f250: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
f260: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
f270: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
f280: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
f290: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
f2a0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
f2b0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
f2c0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
f2d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
f2e0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
f2f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
f300: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
f310: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
f320: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
f330: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
f340: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
f350: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
f360: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
f370: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
f380: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
f390: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
f3a0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
f3b0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
f3c0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
f3d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
f3e0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
f3f0: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
f400: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
f410: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
f420: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f430: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
f440: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
f450: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
f460: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
f470: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
f480: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
f490: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
f4a0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
f4b0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
f4c0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
f4d0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
f4e0: 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
f4f0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
f500: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
f510: 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
f520: 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
f530: 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
f540: 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
f550: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
f560: 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
f570: 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
f580: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f590: 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
f5a0: 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
f5b0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
f5c0: 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
f5d0: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
f5e0: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
f5f0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
f600: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
f610: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
f620: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
f630: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
f640: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
f650: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
f660: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
f670: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
f680: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
f690: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
f6a0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
f6b0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
f6c0: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
f6d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f6e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
f6f0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
f700: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
f710: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
f720: 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
f730: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
f740: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
f750: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
f760: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
f770: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
f780: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
f790: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
f7a0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
f7b0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
f7c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
f7d0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
f7e0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
f7f0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
f800: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
f810: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
f820: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
f830: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f840: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
f850: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
f860: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
f870: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
f880: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
f890: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
f8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f8b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
f8c0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
f8d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
f8e0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
f8f0: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
f900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f910: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f920: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
f930: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f940: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
f950: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
f960: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
f970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
f980: 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
f990: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f9a0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
f9b0: 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20  tRow>(u64)n ){. 
f9c0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
f9d0: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
f9e0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f9f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
fa00: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
fa10: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
fa20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa30: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
fa40: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
fa50: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fa60: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fa70: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
fa80: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
fa90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
faa0: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
fab0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
fac0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fae0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
faf0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
fb00: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
fb10: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
fb20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
fb30: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
fb40: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
fb50: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
fb60: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
fb70: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fb80: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
fb90: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
fba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fbb0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
fbc0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
fbd0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fbe0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fbf0: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
fc00: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
fc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fc20: 2c 20 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73  , OP_SetIfNotPos
fc30: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
fc40: 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  et, 0);.      sq
fc50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fc60: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
fc70: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
fc80: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
fc90: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fca0: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fcb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fcc0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
fcd0: 74 49 66 4e 6f 74 50 6f 73 2c 20 69 4c 69 6d 69  tIfNotPos, iLimi
fce0: 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 2d 31  t, iOffset+1, -1
fcf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fd00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd10: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
fd20: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
fd30: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
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 69 43 6f 6c  nce for the iCol
fd60: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
fd70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
fd80: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fd90: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
fda0: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
fdb0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
fdc0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
fdd0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
fde0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fdf0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fe00: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
fe10: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
fe20: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
fe30: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
fe40: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
fe50: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
fe60: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
fe70: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
fe80: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
fe90: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
fea0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
feb0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
fec0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
fed0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
fee0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
fef0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
ff00: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
ff10: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
ff20: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
ff30: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
ff40: 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
ff50: 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
ff60: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
ff70: 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
ff80: 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
ff90: 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
ffa0: 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
ffb0: 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
ffc0: 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
ffd0: 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
ffe0: 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
fff0: 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
10000 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
10010 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
10020 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
10030 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10040 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
10050 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
10060 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10070 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
10080 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
10090 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
100a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
100b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
100c0 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
100d0 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
100e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
100f0 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
10100 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
10110 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
10120 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
10130 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
10140 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
10150 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
10160 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
10170 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
10180 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
10190 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
101a0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
101b0 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
101c0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
101d0 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
101e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
101f0 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
10200 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
10210 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
10220 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
10230 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
10240 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
10250 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
10260 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
10270 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
10280 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10290 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
102a0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
102b0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
102c0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
102d0 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
102e0 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
102f0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10300 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
10310 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
10320 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
10330 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
10340 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
10350 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
10360 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
10370 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
10380 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
10390 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
103a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
103b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
103c0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
103d0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
103e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
103f0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
10400 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
10410 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
10420 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
10430 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
10440 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
10450 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10460 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
10470 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
10480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10490 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
104a0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
104b0 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
104c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
104d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
104e0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
104f0 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
10500 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
10510 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
10520 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
10530 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
10540 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
10550 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10560 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
10570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10580 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
10590 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
105a0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
105b0 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
105c0 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
105d0 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
105e0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
105f0 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
10600 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
10610 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
10620 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
10630 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
10660 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10670 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
106a0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
106b0 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
106c0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
106d0 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
106e0 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
106f0 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
10700 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
10710 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
10720 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
10730 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
10740 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
10750 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
10760 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
10770 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
10780 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
10790 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
107a0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
107b0 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
107c0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
107d0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
107e0 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
107f0 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
10800 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
10810 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
10820 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
10830 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10840 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10850 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10860 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10870 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10880 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
10890 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
108a0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
108b0 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
108c0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
108d0 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
108e0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
108f0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
10900 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
10910 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
10920 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
10930 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
10940 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
10950 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
10960 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
10970 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
10980 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
10990 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
109a0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
109b0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
109c0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
109d0 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
109e0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
109f0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
10a00 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
10a10 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
10a20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
10a30 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
10a40 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
10a50 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
10a60 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
10a70 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
10a80 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
10a90 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
10aa0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
10ab0 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
10ac0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10ad0 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
10ae0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
10af0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
10b00 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
10b10 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
10b20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
10b30 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
10b40 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
10b50 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
10b60 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
10b70 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
10b80 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
10b90 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
10ba0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
10bb0 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
10bc0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
10bd0 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
10be0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
10bf0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
10c00 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
10c10 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
10c20 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
10c30 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
10c40 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
10c50 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
10c60 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
10c70 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
10c80 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
10c90 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
10ca0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
10cb0 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
10cc0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
10cd0 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
10ce0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
10cf0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
10d00 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10d10 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10d20 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
10d30 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10d40 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10d50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10d70 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
10d80 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
10d90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10da0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10db0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
10dc0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
10dd0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
10de0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
10df0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
10e00 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
10e10 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
10e20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
10e30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
10e40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10e50 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
10e60 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
10e70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10e80 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
10e90 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
10ea0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
10eb0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
10ec0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
10ed0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
10ee0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
10ef0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
10f00 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
10f10 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10f20 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
10f30 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10f40 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
10f50 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
10f60 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10f70 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
10f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10f90 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
10fa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
10fb0 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
10fc0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10fd0 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
10fe0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10ff0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
11000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11010 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
11020 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
11030 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11040 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
11050 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
11060 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
11070 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
11080 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
11090 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
110a0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
110b0 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
110c0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
110d0 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
110e0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
110f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11120 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
11150 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
11160 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
11170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
11180 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11190 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
111a0 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
111b0 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
111c0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
111d0 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
111e0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
111f0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
11200 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
11210 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
11220 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
11230 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
11240 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
11250 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11260 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11270 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
11280 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
11290 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
112a0 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
112b0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
112c0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
112d0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
112e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
112f0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
11300 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
11310 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
11320 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
11330 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
11340 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11350 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
11360 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
11370 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
11380 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
11390 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
113a0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
113b0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
113c0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
113d0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
113e0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
113f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
11400 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
11410 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
11420 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
11430 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11440 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
11450 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
11460 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
11470 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
11480 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11490 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
114a0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
114b0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
114c0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
114d0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
114e0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
114f0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
11500 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
11510 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
11520 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
11530 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
11540 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
11550 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
11560 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
11570 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
11580 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11590 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
115a0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
115b0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
115c0 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
115d0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
115e0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
115f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
11600 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
11610 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11620 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
11630 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
11640 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
11650 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
11660 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11670 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11680 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
11690 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
116a0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
116b0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
116c0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
116d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
116e0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
116f0 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
11700 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
11710 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
11720 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
11730 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
11740 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
11750 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
11760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11770 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11780 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
11790 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
117a0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
117b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
117c0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
117d0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
117e0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
117f0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
11800 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11820 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11830 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
11840 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
11850 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
11860 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
11870 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
11880 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
11890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118a0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
118b0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
118c0 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
118d0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
118e0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
118f0 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
11900 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11910 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
11920 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
11930 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
11940 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
11950 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
11960 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
11970 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
11980 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
11990 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
119a0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
119b0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
119c0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
119d0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
119e0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
119f0 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
11a00 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
11a10 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
11a20 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
11a30 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
11a40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
11a50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11a60 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
11a70 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
11a80 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
11a90 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
11aa0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
11ab0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
11ac0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11ad0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
11ae0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
11af0 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
11b00 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
11b10 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
11b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b30 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
11b40 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
11b50 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
11b60 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
11b70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
11b90 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
11ba0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
11bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11bc0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
11bd0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
11be0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
11bf0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
11c00 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
11c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11c20 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
11c30 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
11c40 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
11c50 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
11c60 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
11c70 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
11c80 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
11c90 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
11ca0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
11cb0 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
11cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11cd0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
11ce0 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
11cf0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11d00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11d10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11d20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11d30 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
11d40 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
11d50 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
11d60 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
11d70 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
11d80 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
11d90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
11da0 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
11db0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11dc0 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
11dd0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
11de0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
11df0 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
11e00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11e10 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
11e20 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
11e30 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
11e40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
11e50 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
11e60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11e70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
11e80 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
11e90 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
11ea0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
11eb0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
11ec0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
11ed0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
11ee0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
11ef0 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
11f00 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
11f10 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
11f20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11f30 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
11f40 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
11f50 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
11f60 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11f70 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
11f80 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
11f90 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11fa0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
11fb0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
11fc0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
11fd0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11fe0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11ff0 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12000 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12010 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12020 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12030 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
12040 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12050 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12060 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12080 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12090 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
120a0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
120b0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
120c0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
120d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
120e0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
120f0 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12100 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12110 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12120 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12130 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12140 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12150 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12160 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12170 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12180 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12190 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
121a0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
121b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
121c0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
121d0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
121e0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
121f0 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12200 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12210 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12220 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12230 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12240 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12250 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12260 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12270 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12280 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12290 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
122a0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
122b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
122c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
122d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12300 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12310 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12320 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12330 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12340 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12350 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12360 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
12370 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
12380 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
12390 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
123a0 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
123b0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
123c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
123d0 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
123e0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
123f0 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
12400 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
12410 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
12420 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12430 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
12440 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
12450 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
12460 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
12470 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
12480 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
12490 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
124a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
124b0 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
124c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
124d0 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
124e0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
124f0 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
12500 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
12510 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
12520 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
12530 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
12540 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
12550 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12560 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
12570 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
12580 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
12590 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
125a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
125b0 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
125c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
125d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
125e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
125f0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
12600 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
12610 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
12620 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
12630 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
12640 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
12650 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
12660 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
12670 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
12680 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
12690 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
126a0 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
126b0 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
126c0 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
126d0 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
126e0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
126f0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
12700 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
12710 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12720 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
12730 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
12740 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
12750 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
12760 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
12770 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
12780 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
12790 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
127a0 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
127b0 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
127c0 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
127d0 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
127e0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
127f0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
12800 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
12810 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
12820 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
12830 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
12840 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
12850 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
12860 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
12870 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
12880 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
12890 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
128a0 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
128b0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
128d0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
128e0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
128f0 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
12900 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
12910 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
12920 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
12930 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
12940 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12950 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
12960 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
12970 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
12980 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
12990 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
129a0 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
129b0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
129c0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
129d0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
129e0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
129f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
12a00 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
12a10 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
12a20 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
12a30 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
12a40 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
12a50 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
12a60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12a70 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12a80 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12aa0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12ab0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
12ac0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
12ad0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12ae0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12af0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12b00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
12b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12b20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
12b30 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
12b40 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
12b50 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
12b60 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
12b70 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
12b80 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
12b90 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12ba0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12bb0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
12bc0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12bd0 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
12be0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
12bf0 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
12c00 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
12c10 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
12c20 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
12c30 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
12c40 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
12c50 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12c60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c80 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
12c90 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
12ca0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
12cb0 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
12cc0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
12cd0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
12ce0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
12cf0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
12d00 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
12d10 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
12d20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
12d30 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
12d40 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
12d50 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
12d60 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
12d70 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
12d80 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
12d90 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
12da0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12db0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
12dc0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
12dd0 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
12de0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
12df0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
12e00 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
12e10 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
12e20 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
12e30 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
12e40 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
12e50 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
12e60 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
12e70 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
12e80 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
12e90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12ea0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
12eb0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
12ec0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
12ed0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
12ee0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
12ef0 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
12f00 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12f10 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12f20 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
12f30 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
12f40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12f50 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
12f60 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
12f70 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12f80 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12f90 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12fa0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12fb0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12fc0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12fd0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
12fe0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12ff0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13000 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13010 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13020 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
13030 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13040 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13050 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13060 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13080 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13090 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
130a0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
130b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
130c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
130d0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
130e0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
130f0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13100 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13110 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
13120 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65  ORDERED);.    de
13130 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
13140 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
13150 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
13160 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
13170 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13180 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
13190 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
131a0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
131b0 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
131c0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
131d0 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
131e0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
131f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
13200 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13210 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
13220 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
13230 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
13240 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
13250 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
13260 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
13270 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
13280 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13290 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
132a0 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
132b0 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
132c0 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
132d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
132e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
132f0 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
13300 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
13310 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
13320 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
13330 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
13340 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
13350 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
13360 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
13370 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
13380 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13390 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
133a0 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
133b0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
133c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
133d0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
133e0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
133f0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
13400 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
13410 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
13420 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
13430 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
13440 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
13450 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
13460 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
13470 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
13480 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
13490 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
134a0 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
134b0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
134c0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
134d0 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
134e0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
134f0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
13500 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
13510 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
13520 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
13530 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
13540 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13550 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13560 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13580 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
13590 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
135a0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
135b0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
135c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
135d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
135e0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
135f0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
13600 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13610 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
13620 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
13630 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
13640 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
13650 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
13660 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
13670 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
13680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13690 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
136a0 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62   p->iLimit); Vdb
136b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
136c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
136d0 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
136e0 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
136f0 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ed"));.        i
13700 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
13710 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13720 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13730 4f 50 5f 53 65 74 49 66 4e 6f 74 50 6f 73 2c 20  OP_SetIfNotPos, 
13740 70 2d 3e 69 4f 66 66 73 65 74 2c 20 70 2d 3e 69  p->iOffset, p->i
13750 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
13760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13770 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
13780 64 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d  d, p->iLimit, p-
13790 3e 69 4f 66 66 73 65 74 2c 20 70 2d 3e 69 4f 66  >iOffset, p->iOf
137a0 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  fset+1);.       
137b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
137c0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49 66  dOp3(v, OP_SetIf
137d0 4e 6f 74 50 6f 73 2c 20 70 2d 3e 69 4c 69 6d 69  NotPos, p->iLimi
137e0 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c  t, p->iOffset+1,
137f0 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
13800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
13810 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
13820 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
13830 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
13840 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13850 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
13860 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
13870 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
13880 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
13890 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
138a0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
138b0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
138c0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
138d0 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
138e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
138f0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
13900 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
13910 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
13920 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
13930 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
13940 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20      && nLimit>0 
13950 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
13960 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a   > (u64)nLimit .
13970 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13980 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
13990 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d   nLimit;.      }
139a0 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20  .      if( addr 
139b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
139c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
139d0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
139e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
139f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13a00 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65  EXCEPT:.    case
13a10 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
13a20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b     int unionTab;
13a30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
13a40 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
13a50 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64  orary table hold
13a60 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  ing result */.  
13a70 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20      u8 op = 0;  
13a80 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
13a90 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
13aa0 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73  ns to apply to s
13ab0 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  elf */.      int
13ac0 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
13ad0 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
13ae0 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
13af0 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
13b00 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
13b10 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f  mit, *pOffset; /
13b20 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
13b30 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20  f p->nLimit and 
13b40 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->nOffset */.  
13b50 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
13b60 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75      SelectDest u
13b70 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20  niondest;..     
13b80 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13b90 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20  ==TK_EXCEPT );. 
13ba0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13bb0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
13bc0 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ;.      priorOp 
13bd0 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
13be0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
13bf0 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t==priorOp ){.  
13c00 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
13c10 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
13c20 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
13c30 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
13c40 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
13c50 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
13c60 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13c70 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29  ( p->pLimit==0 )
13c80 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  ;      /* Not al
13c90 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
13ca0 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
13cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13cc0 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
13cd0 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
13ce0 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
13cf0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
13d00 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
13d10 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
13d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d30 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
13d40 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
13d50 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
13d60 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
13d70 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
13d80 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
13d90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13da0 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
13db0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13dd0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
13de0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
13df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13e00 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
13e10 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
13e20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
13e30 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
13e40 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
13e50 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
13e60 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
13e70 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69  ;.        findRi
13e80 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
13e90 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
13ea0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
13eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13ec0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
13ed0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
13ee0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13ef0 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
13f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
13f10 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
13f20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
13f30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13f40 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65  estInit(&unionde
13f50 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  st, priorOp, uni
13f60 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78  onTab);.      ex
13f70 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
13f80 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
13f90 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
13fa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13fb0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
13fc0 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65  pPrior, &unionde
13fd0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
13fe0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
13ff0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14000 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
14010 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
14020 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
14030 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
14040 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
14050 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
14060 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
14070 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65  Except;.      }e
14080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
14090 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
140a0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
140b0 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  op = SRT_Union;.
140c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
140d0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
140e0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
140f0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
14100 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
14110 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
14120 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
14130 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
14140 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
14150 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
14160 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14170 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14180 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14190 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
141a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
141b0 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
141c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
141d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
141e0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72  );.      /* Quer
141f0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  y flattening in 
14200 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
14210 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e  might refill p->
14220 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20  pOrderBy..      
14230 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65  ** Be sure to de
14240 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79  lete p->pOrderBy
14250 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20  , therefore, to 
14260 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c  avoid a memory l
14270 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  eak. */.      sq
14280 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
14290 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
142a0 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  rBy);.      pDel
142b0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
142c0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
142d0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
142e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
142f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
14300 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d  p==TK_UNION ) p-
14310 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
14320 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
14330 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
14340 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14350 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
14360 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
14370 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
14380 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
14390 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
143a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
143b0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20  Offset = 0;..   
143c0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
143d0 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
143e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
143f0 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
14400 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
14410 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
14420 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
14430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
14440 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
14450 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
14460 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
14470 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
14480 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
14490 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
144a0 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
144b0 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
144c0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
144d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
144e0 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
144f0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  put ){.         
14500 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
14510 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = p;.          w
14520 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
14530 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
14540 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
14550 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
14560 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
14570 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53  arse, pFirst->pS
14580 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69  rc, pFirst->pELi
14590 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
145a0 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
145b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
145c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
145d0 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
145e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
145f0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
14600 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
14610 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
14620 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
14630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14640 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
14650 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
14660 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14670 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
14680 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14690 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
146a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
146b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
146c0 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
146d0 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
146e0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
146f0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
14700 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
14710 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14720 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
14730 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
14740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14750 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
14760 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
14770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14790 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
147a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
147b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
147d0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
147e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
147f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14800 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
14810 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
14820 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
14830 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
14840 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
14850 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
14860 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14870 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
14880 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14890 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
148a0 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
148b0 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
148c0 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
148d0 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
148e0 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
148f0 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
14900 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
14910 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
14920 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
14930 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
14940 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
14950 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
14960 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
14970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
14980 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
14990 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
149a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
149b0 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
149c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
149d0 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
149e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
149f0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14a00 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
14a10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14a20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14a30 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
14a40 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
14a50 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
14a60 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14a70 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14a80 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14a90 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
14aa0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
14ab0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14ac0 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
14ad0 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
14ae0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
14af0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14b00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14b10 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
14b20 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
14b30 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
14b40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14b50 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14b60 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14b70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b80 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14b90 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
14ba0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14bb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14bc0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14bd0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14be0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14bf0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14c00 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
14c10 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
14c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
14c30 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14c40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14c50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
14c60 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14c70 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14c80 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
14c90 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14ca0 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
14cb0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14cd0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14ce0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14cf0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14d00 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14d10 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14d20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
14d30 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
14d40 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
14d50 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14d60 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14d70 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14d80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d90 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14da0 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
14db0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14dc0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14dd0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14de0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14df0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14e00 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14e10 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
14e20 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
14e30 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
14e40 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
14e50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14e60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14e70 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14e80 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14e90 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14ea0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14eb0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
14ec0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
14ed0 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
14ee0 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
14ef0 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
14f00 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
14f10 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14f20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14f30 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
14f40 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
14f50 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
14f60 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
14f70 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
14f80 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
14f90 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
14fa0 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
14fb0 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14fc0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14fd0 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
14fe0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15000 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
15010 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15020 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
15030 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15040 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15050 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
15060 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
15070 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15090 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
150a0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
150b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
150c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
150d0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
150e0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
150f0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15110 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
15120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15130 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
15140 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
15150 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
15160 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15180 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15190 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
151a0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
151b0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
151c0 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151e0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
151f0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15210 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15220 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
15230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15240 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
15250 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
15260 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15270 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15280 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
15290 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
152a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
152b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
152c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
152d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
152e0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
152f0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
15310 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15320 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
15330 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
15340 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
15350 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
15360 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
15370 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
15380 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
15390 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
153a0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
153b0 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
153c0 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
153d0 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
153e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
153f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
15400 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
15410 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
15420 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15430 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
15440 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
15450 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
15460 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
15470 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
15480 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
15490 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
154a0 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
154b0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
154c0 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
154d0 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
154e0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
154f0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15500 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
15510 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
15520 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15540 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15550 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15560 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
15570 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
15580 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
15590 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
155a0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
155d0 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
155e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
155f0 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
15600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15610 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
15620 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
15630 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
15640 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
15650 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15660 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
15670 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
15680 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15690 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
156a0 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
156b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
156c0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
156d0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
156e0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
156f0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
15700 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15710 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
15720 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15730 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
15740 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
15750 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
15760 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
15770 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
15780 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
15790 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
157a0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
157b0 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
157c0 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
157d0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
157e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
157f0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
15800 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
15810 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
15820 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15830 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
15840 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
15850 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15860 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
15870 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
15880 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
15890 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
158a0 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
158b0 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
158c0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
158d0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
158e0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
158f0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
15900 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
15910 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
15920 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15930 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
15940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15950 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
15960 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
15970 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
15980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15990 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
159a0 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
159b0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
159c0 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
159f0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
15a00 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
15a10 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
15a20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
15a30 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
15a40 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
15a50 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
15a60 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
15a70 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
15a80 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
15a90 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
15aa0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15ab0 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
15ac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
15ad0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15ae0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72   */../*.** Error
15b00 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65   message for whe
15b10 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  n two or more te
15b20 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  rms of a compoun
15b30 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69  d select have di
15b40 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20  fferent.** size 
15b50 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a  result sets..*/.
15b60 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
15b70 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
15b80 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
15b90 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
15ba0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15bb0 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
15bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15bd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
15be0 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
15bf0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
15c00 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
15c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15c20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15c30 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
15c40 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
15c50 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
15c60 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
15c70 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
15c80 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
15c90 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
15ca0 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->op));.  }.}../
15cb0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
15cc0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
15cd0 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
15ce0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
15cf0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
15d00 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
15d10 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
15d20 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
15d30 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
15d40 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
15d50 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
15d60 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
15d70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
15d80 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
15d90 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
15da0 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
15db0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
15dc0 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
15dd0 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
15de0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
15df0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
15e00 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
15e10 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
15e20 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
15e30 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
15e40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
15e50 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
15e60 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
15e70 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
15e80 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
15e90 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
15ea0 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
15eb0 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
15ec0 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
15ed0 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
15ee0 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
15ef0 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
15f00 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
15f10 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
15f20 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
15f30 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
15f40 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
15f50 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
15f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
15f70 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
15f80 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
15f90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
15fa0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15fb0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15fc0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
15fd0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
15fe0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
15ff0 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
16000 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
16010 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
16020 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
16030 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
16040 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
16050 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
16060 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
16070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
16080 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
16090 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
160a0 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
160b0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
160c0 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
160d0 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
160e0 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
160f0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
16100 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
16110 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
16120 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
16130 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
16140 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16150 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
16160 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
16170 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
16180 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
16190 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
161a0 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
161b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
161c0 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
161d0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
161e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
161f0 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
16200 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
16210 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
16220 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
16230 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
16240 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
16250 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  dr2;.    addr1 =
16260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16270 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16280 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
16290 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61  verage(v);.    a
162a0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
162b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
162c0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
162d0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
162e0 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16310 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
16320 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
16330 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
16340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16350 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
16360 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
16370 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f  addr2+2); VdbeCo
16380 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
16390 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
163a0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
163b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163c0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
163d0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
163e0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
163f0 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
16400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16410 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
16420 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
16430 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
16440 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
16450 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
16460 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20  press the first 
16470 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
16480 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
16490 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
164a0 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
164b0 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
164c0 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65  ntinue);..  asse
164d0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
164e0 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a  !=SRT_Exists );.
164f0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
16500 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c  >eDest!=SRT_Tabl
16510 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  e );.  switch( p
16520 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20  Dest->eDest ){. 
16530 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
16540 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
16550 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
16560 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
16570 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
16580 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
16590 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
165a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
165b0 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
165c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
165d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
165e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
165f0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
16600 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16610 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20  ->nSdst, r1);.  
16620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16630 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
16640 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  owid, pDest->iSD
16650 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
16660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16670 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
16680 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
16690 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
166a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
166b0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
166c0 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c  PEND);.      sql
166d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
166e0 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
166f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
16700 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16710 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
16720 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
16730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16740 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
16750 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
16760 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
16770 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
16780 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
16790 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
167a0 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
167b0 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
167c0 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
167d0 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
167e0 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
167f0 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
16800 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
16810 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
16820 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
16830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
16840 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
16850 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
16860 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
16870 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20  fSdst = .       
16880 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
16890 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
168a0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
168b0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b  pDest->affSdst);
168c0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
168d0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
168e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
168f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16900 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
16910 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20   pIn->iSdst, 1, 
16920 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53  r1, &pDest->affS
16930 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71  dst,1);.      sq
16940 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16950 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16960 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
16970 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
16980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16990 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
169a0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
169b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
169c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
169d0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
169e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
169f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16a00 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
16a10 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
16a20 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
16a30 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
16a40 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
16a50 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
16a60 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
16a70 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
16a80 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
16a90 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
16aa0 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
16ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
16ac0 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
16ad0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
16ae0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
16af0 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
16b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16b10 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
16b20 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16b30 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
16b40 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
16b50 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
16b60 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
16b70 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
16b80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16b90 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
16ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
16bb0 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
16bc0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
16bd0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
16be0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
16bf0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
16c00 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
16c10 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
16c20 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
16c30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16c40 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
16c50 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
16c60 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
16c70 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
16c80 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
16c90 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
16ca0 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
16cb0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
16cc0 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
16cd0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16ce0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16cf0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
16d00 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16d10 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16d20 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16d30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16d40 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
16d50 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
16d60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16d70 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
16d80 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
16d90 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
16da0 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
16db0 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
16dc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16dd0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16de0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
16df0 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
16e00 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
16e10 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
16e20 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
16e30 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
16e40 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
16e50 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
16e60 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
16e70 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
16e80 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
16e90 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
16ea0 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
16eb0 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
16ec0 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
16ed0 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
16ee0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
16ef0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
16f00 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
16f10 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
16f20 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
16f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16f40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
16f50 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
16f60 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16f80 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
16f90 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
16fa0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16fb0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
16fc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16fd0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
16fe0 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
16ff0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
17000 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
17010 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
17020 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17030 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
17040 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
17050 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
17060 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17070 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
17080 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
17090 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
170a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
170b0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
170c0 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
170d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
170e0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
170f0 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
17100 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
17110 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
17120 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
17130 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
17140 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
17150 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
17160 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
17170 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
17180 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17190 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
171a0 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
171b0 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
171c0 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
171d0 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
171e0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
171f0 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
17200 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
17210 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
17220 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
17230 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
17240 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
17250 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
17260 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
17270 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
17280 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
17290 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
172a0 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
172b0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
172c0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
172d0 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
172e0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
172f0 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
17300 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
17310 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
17320 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
17330 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
17340 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
17350 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
17360 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
17370 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
17380 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
17390 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
173a0 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
173b0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
173c0 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
173d0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
173e0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
173f0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17400 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
17410 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
17420 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
17430 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
17440 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
17450 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
17460 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
17470 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
17480 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
17490 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
174a0 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
174b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
174c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
174d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
174e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
174f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
17500 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
17510 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
17520 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
17530 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
17540 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
17550 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
17560 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
17570 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
17580 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
17590 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
175a0 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
175b0 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
175c0 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
175d0 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
175e0 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
175f0 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
17600 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
17610 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
17620 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
17630 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
17640 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
17650 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
17660 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
17670 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
17680 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
17690 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
176a0 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
176b0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
176c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176d0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
176e0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
176f0 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
17700 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
17710 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17720 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
17730 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
17740 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
17750 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
17760 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17770 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
17780 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
17790 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
177a0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
177b0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
177c0 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
177d0 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
177e0 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
177f0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
17800 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
17810 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
17820 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
17830 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
17840 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
17850 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
17860 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
17870 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
17880 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
17890 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
178a0 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
178b0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
178c0 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
178d0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
178e0 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
178f0 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
17900 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
17910 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
17920 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
17930 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
17940 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
17950 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
17960 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
17970 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
17980 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
17990 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
179a0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
179b0 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
179c0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
179d0 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
179e0 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
179f0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
17a00 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
17a10 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
17a20 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
17a30 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
17a40 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
17a50 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
17a60 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
17a70 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
17a80 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
17a90 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
17aa0 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
17ab0 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
17ac0 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
17ad0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
17ae0 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
17af0 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
17b00 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
17b10 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
17b20 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
17b30 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
17b40 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
17b50 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
17b60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
17b70 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
17b80 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
17b90 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
17ba0 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
17bb0 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
17bc0 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
17bd0 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
17be0 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
17bf0 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
17c00 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
17c10 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
17c20 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
17c30 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
17c40 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
17c50 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
17c60 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
17c70 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
17c80 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
17c90 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
17ca0 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
17cb0 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
17cc0 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
17cd0 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
17ce0 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
17cf0 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
17d00 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
17d10 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
17d20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
17d30 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
17d40 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
17d50 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
17d60 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
17d70 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
17d80 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
17d90 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
17da0 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
17db0 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
17dc0 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
17dd0 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
17de0 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
17df0 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
17e00 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
17e10 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
17e20 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
17e30 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
17e40 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
17e50 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
17e60 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
17e70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17e80 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
17e90 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
17ea0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
17eb0 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
17ec0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17ed0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17ee0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
17ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17f00 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
17f10 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
17f20 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
17f30 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
17f40 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
17f50 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
17f60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
17f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17f80 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
17f90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
17fa0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
17fb0 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
17fc0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
17fd0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
17fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17ff0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18000 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
18010 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
18020 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
18030 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
18040 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
18050 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
18060 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
18070 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
18080 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
18090 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
180a0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
180b0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
180c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
180d0 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
180e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
180f0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
18100 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
18110 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
18120 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
18130 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
18140 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
18150 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
18160 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
18170 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
18180 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
18190 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
181a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
181b0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
181c0 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
181d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
181e0 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
181f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18200 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
18210 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18220 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18230 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
18240 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18250 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
18260 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18270 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
18280 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18290 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
182a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
182b0 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
182c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
182d0 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
182e0 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
182f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
18300 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
18310 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
18320 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
18330 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
18340 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
18350 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18360 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
18370 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
18380 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
18390 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
183a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
183b0 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
183c0 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
183d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
183e0 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
183f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18400 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
18410 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18420 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
18430 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18440 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
18450 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
18460 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
18470 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
18480 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
18490 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
184a0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
184b0 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
184c0 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
184d0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
184e0 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
184f0 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
18500 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
18510 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
18520 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
18530 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
18540 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
18550 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
18560 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
18570 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
18580 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
18590 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
185a0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
185b0 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
185c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
185d0 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
185e0 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
185f0 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
18600 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
18610 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
18620 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
18630 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
18640 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
18650 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
18660 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
18670 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
18680 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
18690 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
186a0 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
186b0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
186c0 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
186d0 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
186e0 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
186f0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
18700 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
18710 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
18720 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
18730 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18740 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18750 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18760 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
18770 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18780 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
18790 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
187a0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
187b0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
187c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
187d0 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
187e0 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
187f0 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
18800 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
18810 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
18820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
18830 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
18840 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
18850 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
18860 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
18870 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
18880 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
18890 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
188a0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
188b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
188c0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
188d0 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
188e0 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
188f0 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
18900 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
18910 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
18920 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
18930 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
18940 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
18950 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
18960 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
18970 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
18980 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
18990 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
189a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
189b0 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
189c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
189d0 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
189e0 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
189f0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
18a00 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
18a10 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
18a20 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
18a30 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
18a40 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
18a50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18a60 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
18a70 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
18a80 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
18a90 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
18aa0 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
18ab0 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
18ac0 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
18ad0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
18ae0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
18af0 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
18b00 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
18b10 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
18b20 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
18b30 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
18b40 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
18b50 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
18b60 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
18b70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18b80 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
18b90 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18ba0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
18bb0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
18bc0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
18bd0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
18be0 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
18bf0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
18c00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18c10 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18c20 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
18c30 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
18c40 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
18c50 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
18c60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
18c70 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
18c80 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
18c90 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
18ca0 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
18cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
18cc0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
18cd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18ce0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
18cf0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
18d00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
18d10 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
18d20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
18d30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
18d40 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
18d50 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
18d60 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
18d70 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
18d80 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
18d90 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
18da0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
18db0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
18dc0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
18dd0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
18de0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
18df0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
18e00 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
18e10 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
18e20 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
18e30 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
18e40 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
18e50 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
18e60 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
18e70 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
18e80 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
18e90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18ea0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
18eb0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
18ec0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
18ed0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
18ee0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
18ef0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
18f00 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
18f10 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
18f20 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
18f30 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
18f40 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
18f50 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
18f60 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
18f70 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
18f80 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
18f90 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
18fa0 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
18fb0 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
18fc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18fd0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18fe0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
18ff0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19000 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19010 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
19020 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
19030 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
19040 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19050 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
19060 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c   pKeyMerge = mul
19070 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
19080 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
19090 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
190a0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
190b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
190c0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
190d0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
190e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
190f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
19100 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
19110 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
19120 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
19130 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
19140 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
19150 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
19160 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
19170 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
19180 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
19190 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
191a0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
191b0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
191c0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
191d0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
191e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
191f0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
19200 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
19210 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19220 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
19230 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
19240 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
19250 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
19260 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
19270 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
19280 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
19290 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
192a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
192b0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
192c0 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
192d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
192e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
192f0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
19300 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
19310 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
19320 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
19330 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
19340 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
19350 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
19360 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
19370 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
19380 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
19390 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
193a0 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
193b0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
193c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
193d0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
193e0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
193f0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
19400 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
19410 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
19420 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
19430 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
19440 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
19450 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
19460 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
19470 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
19480 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
19490 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
194a0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
194b0 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
194c0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
194d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
194e0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
194f0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
19500 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
19510 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
19520 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
19530 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
19540 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
19550 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
19560 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
19570 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
19580 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
19590 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
195a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
195b0 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
195c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
195d0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
195e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
195f0 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
19600 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
19610 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19640 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
19650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19660 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
19670 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
19680 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19690 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
196a0 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
196b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
196c0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
196d0 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
196e0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
196f0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
19700 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
19710 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
19720 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
19730 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
19740 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
19750 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
19760 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19770 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
19780 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19790 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
197a0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
197b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
197c0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
197d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
197e0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
197f0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
19800 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19810 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
19820 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
19830 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
19840 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
19850 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
19860 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
19870 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
19880 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
19890 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
198a0 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
198b0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
198c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
198d0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
198e0 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
198f0 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
19900 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
19910 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
19920 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
19930 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
19940 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
19950 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
19960 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
19970 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19980 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
19990 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
199a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
199b0 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
199c0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
199d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
199e0 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a  v, addr1);..  /*
199f0 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
19a00 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
19a10 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
19a20 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
19a30 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
19a40 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
19a50 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
19a60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19a70 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
19a80 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
19a90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19aa0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
19ab0 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64  regAddrB, 0, add
19ac0 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62  rSelectB);.  Vdb
19ad0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69  eComment((v, "ri
19ae0 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
19af0 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
19b00 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
19b10 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
19b20 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
19b30 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
19b40 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
19b50 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e   .  explainSetIn
19b60 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
19b70 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
19b80 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
19b90 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
19ba0 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c  &destB);.  p->iL
19bb0 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69  imit = savedLimi
19bc0 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  t;.  p->iOffset 
19bd0 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20  = savedOffset;. 
19be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19bf0 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
19c00 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
19c10 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19c20 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
19c30 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
19c40 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
19c50 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
19c60 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
19c70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
19c80 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
19c90 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19ca0 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
19cb0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
19cc0 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
19cd0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19ce0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19d00 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
19d10 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19d30 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19d40 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
19d50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19d60 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19d70 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19d80 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
19d90 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19da0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19db0 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19dc0 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19dd0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
19de0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
19df0 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
19e00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
19e10 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
19e20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
19e30 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
19e40 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
19e50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
19e60 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
19e70 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
19e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19e90 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
19ea0 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
19eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
19ec0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
19ed0 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
19ee0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19ef0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
19f00 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
19f10 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
19f20 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
19f30 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
19f40 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
19f50 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
19f60 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
19f70 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19f80 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
19f90 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
19fa0 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
19fb0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
19fc0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
19fd0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19fe0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
19ff0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a000 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1a010 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1a020 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1a030 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a040 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1a050 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1a060 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1a090 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1a0a0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1a0b0 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1a0c0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1a0d0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
1a0e0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
1a0f0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a100 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1a110 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1a120 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1a130 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1a140 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1a150 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1a160 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1a170 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1a180 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1a190 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1a1a0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1a1b0 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1a1c0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1a1d0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1a1e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1a1f0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1a200 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a210 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1a220 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1a230 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1a240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1a250 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1a260 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1a270 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a280 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1a290 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1a2a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1a2c0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1a2d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1a2e0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a2f0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a300 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1a310 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a320 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1a330 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1a340 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a350 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a360 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a370 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1a380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a390 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a3a0 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1a3b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1a3c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a3d0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a3e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a3f0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a400 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1a410 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a420 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1a430 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1a440 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1a450 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a460 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a470 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1a480 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1a490 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a4a0 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1a4b0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a4c0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1a4d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a4e0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a4f0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a500 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1a510 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a520 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1a530 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1a540 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a550 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1a560 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1a570 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1a580 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1a590 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a5a0 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1a5b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1a5c0 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1a5d0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1a5e0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1a5f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a600 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1a610 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1a620 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1a630 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a640 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1a650 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1a660 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1a670 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1a680 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a690 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1a6a0 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1a6b0 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1a6c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a6d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1a6e0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1a6f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a700 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a710 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1a720 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a730 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a740 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a750 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1a760 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1a770 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1a780 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1a790 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1a7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a7b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a7c0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1a7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a7e0 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1a7f0 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1a800 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1a810 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1a820 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a830 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1a840 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1a850 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1a860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a870 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1a880 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1a890 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1a8a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1a8b0 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1a8c0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1a8d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1a8e0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1a8f0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1a900 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a910 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1a920 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1a930 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1a940 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1a950 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1a960 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a970 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1a980 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
1a990 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
1a9a0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
1a9b0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1a9c0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
1a9d0 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
1a9e0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
1a9f0 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
1aa00 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
1aa10 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
1aa20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1aa30 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1aa40 46 69 72 73 74 2d 3e 70 53 72 63 2c 20 70 46 69  First->pSrc, pFi
1aa50 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
1aa60 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
1aa70 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
1aa80 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
1aa90 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
1aaa0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
1aab0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1aac0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
1aad0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1aae0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1aaf0 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
1ab00 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
1ab10 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1ab20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1ab30 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  p;..  /*** TBD: 
1ab40 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
1ab50 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
1ab60 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
1ab70 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
1ab80 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
1ab90 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
1aba0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
1abb0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
1abc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
1abd0 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1abe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1abf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ac00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1ac10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ac20 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
1ac30 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
1ac40 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
1ac50 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
1ac60 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
1ac70 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1ac80 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1ac90 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
1aca0 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
1acb0 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  int, ExprList*, 
1acc0 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  int);../*.** Sca
1acd0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1ace0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1acf0 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1ad00 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1ad10 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1ad20 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1ad30 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1ad40 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1ad50 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1ad60 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1ad70 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1ad80 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1ad90 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1ada0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1adb0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1adc0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1add0 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1ade0 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1adf0 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1ae00 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1ae10 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1ae20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1ae30 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1ae40 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1ae50 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ae60 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1ae70 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1ae80 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1ae90 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1aea0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1aeb0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1aec0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1aed0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1aee0 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1aef0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1af00 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1af10 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1af20 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1af30 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1af40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1af50 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1af60 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1af70 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1af80 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1af90 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1afa0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1afb0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1afc0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1afd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1afe0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1aff0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1b000 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1b010 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1b020 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1b030 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1b040 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1b050 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1b060 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1b070 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1b080 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1b090 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1b0a0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1b0b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1b0c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1b0d0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1b0e0 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1b0f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1b100 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1b110 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1b120 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1b130 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1b140 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1b150 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1b160 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1b170 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1b180 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1b190 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1b1a0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1b1b0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1b1c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b1d0 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b1e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b1f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b200 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b210 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b220 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b230 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b240 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b250 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b260 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b270 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b280 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b290 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b2a0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b2b0 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20   pEList, 1);.   
1b2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1b2d0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b2e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1b2f0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b310 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1b320 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1b330 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
1b340 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1b350 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b360 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1b370 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b380 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
1b390 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1b3a0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1b3b0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
1b3c0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b3d0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b3e0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1b3f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b400 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b410 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b420 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b430 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1b440 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1b450 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b460 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1b470 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1b480 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
1b490 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1b4a0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b4b0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1b4c0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
1b4d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b4e0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1b4f0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1b500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1b510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1b520 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b530 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1b540 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1b550 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b560 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b570 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1b580 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b590 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 53 75 62  EList,    /* Sub
1b5a0 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
1b5b0 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1b5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73           /* Do s
1b5d0 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d  ubstitutes on p-
1b5e0 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29  >pPrior too */.)
1b5f0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b600 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b610 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b620 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b630 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  !p ) return;.  d
1b640 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  o{.    substExpr
1b650 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
1b660 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
1b670 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1b680 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
1b690 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
1b6a0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
1b6b0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b6c0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
1b6d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b6e0 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1b6f0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
1b700 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
1b710 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1b720 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b730 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1b740 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b750 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1b760 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1b770 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1b780 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1b790 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1b7a0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1b7b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1b7c0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
1b7d0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
1b7e0 62 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b  ble, pEList, 1);
1b7f0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1b800 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1b810 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1b820 78 70 72 4c 69 73 74 28 64 62 2c 20 70 49 74 65  xprList(db, pIte
1b830 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
1b840 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b860 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1b870 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1b880 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1b890 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1b8a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1b8b0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1b8c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1b8d0 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1b8e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b8f0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1b900 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1b910 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1b920 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1b930 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1b940 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1b950 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1b960 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1b970 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1b980 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1b990 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1b9a0 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1b9b0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1b9c0 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1b9d0 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1b9e0 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1b9f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1ba00 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1ba10 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1ba20 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1ba30 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1ba40 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1ba50 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1ba60 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1ba70 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1ba80 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1ba90 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1baa0 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1bab0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1bac0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1bad0 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1bae0 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1baf0 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1bb00 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1bb10 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1bb20 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1bb30 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1bb40 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1bb50 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1bb60 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1bb70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1bb80 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bb90 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1bba0 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1bbb0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1bbc0 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1bbd0 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1bbe0 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1bbf0 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1bc00 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1bc10 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1bc20 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1bc30 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1bc40 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1bc50 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1bc60 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1bc70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1bc80 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1bc90 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1bca0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1bcb0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1bcc0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1bcd0 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1bce0 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1bcf0 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1bd00 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1bd10 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1bd20 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1bd30 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
1bd40 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1bd50 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1bd60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
1bd70 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1bd80 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bd90 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
1bda0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1bdb0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
1bdc0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
1bdd0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32   aggregate or (2
1bde0 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  a) the outer que
1bdf0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1be00 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28  .**        and (
1be10 32 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2b) the outer qu
1be20 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1be30 20 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65   subqueries othe
1be40 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a  r than the one.*
1be50 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c  *        FROM-cl
1be60 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1be70 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1be80 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67  e for flattening
1be90 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20  .  (2b is.**    
1bea0 20 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65      due to ticke
1beb0 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1bec0 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d  bf80] from 2015-
1bed0 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  02-09.).**.**   
1bee0 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
1bef0 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
1bf00 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1bf10 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
1bf20 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
1bf30 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
1bf40 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64  6.  Strengthened
1bf50 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
1bf60 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
1bf70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1bf80 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  ot DISTINCT..**.
1bf90 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1bfa0 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1bfb0 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1bfc0 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1bfd0 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1bfe0 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1bff0 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1c000 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1c010 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1c020 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1c030 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1c040 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1c050 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1c060 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1c070 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  ies..**.**   (6)
1c080 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c090 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1c0a0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1c0b0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c0c0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1c0d0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1c0e0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
1c0f0 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
1c100 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75  .  TODO:  For su
1c110 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74  bqueries without
1c120 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f  .**        A FRO
1c130 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64  M clause, consid
1c140 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d  er adding a FROM
1c150 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20   close with the 
1c160 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20  special.**      
1c170 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f    table sqlite_o
1c180 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nce that consist
1c190 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f  s of a single ro
1c1a0 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  w containing a.*
1c1b0 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  *        single 
1c1c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  NULL..**.**   (8
1c1d0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c1e0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c1f0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c200 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1c210 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1c220 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c230 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c240 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1c250 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1c260 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
1c270 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1c280 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1c290 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1c2a0 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1c2b0 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1c2c0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1c2d0 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1c2e0 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1c2f0 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1c300 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1c310 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74  l.**        text
1c320 3a 20 22 54 68 65 20 73 75 62 71 75 65 72 79 20  : "The subquery 
1c330 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1c340 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1c350 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1c360 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75        does not u
1c370 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a  se LIMIT.".**.**
1c380 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
1c390 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1c3a0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c3b0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1c3c0 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1c3d0 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1c3e0 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1c3f0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1c400 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1c410 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
1c420 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
1c430 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
1c440 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
1c450 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
1c460 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c470 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
1c480 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1c490 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1c4a0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1c4b0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
1c4c0 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
1c4d0 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
1c4e0 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
1c4f0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c500 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
1c510 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
1c520 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49  es not have a LI
1c530 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
1c540 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1c550 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1c560 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1c570 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ..**.**  (16)  T
1c580 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c590 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1c5a0 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
1c5b0 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
1c5c0 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
1c5d0 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1c5e0 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1c5f0 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1c600 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1c610 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1c620 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1c630 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1c640 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
1c650 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1c660 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c670 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
1c680 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
1c690 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
1c6a0 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
1c6b0 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
1c6c0 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
1c6d0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
1c6e0 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
1c6f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
1c700 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
1c710 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
1c720 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
1c730 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
1c740 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
1c750 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
1c760 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
1c770 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
1c780 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1c790 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1c7a0 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1c7b0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1c7c0 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1c7d0 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1c7e0 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1c7f0 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1c800 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1c810 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1c820 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1c830 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1c840 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1c850 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1c860 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1c870 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1c880 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1c890 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1c8a0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1c8b0 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1c8c0 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1c8d0 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1c8e0 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1c8f0 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1c900 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1c910 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1c920 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1c930 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1c940 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1c950 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1c960 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1c970 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1c980 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1c990 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1c9a0 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1c9b0 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1c9c0 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1c9d0 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1c9e0 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1c9f0 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1ca00 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1ca10 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1ca20 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1ca30 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1ca40 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1ca50 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1ca60 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1ca70 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1ca80 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1ca90 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1caa0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1cab0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1cac0 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
1cad0 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1cae0 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1caf0 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1cb00 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1cb10 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1cb20 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
1cb30 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1cb40 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1cb50 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1cb60 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1cb70 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
1cb80 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
1cb90 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1cba0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1cbb0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
1cbc0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
1cbd0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
1cbe0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
1cbf0 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
1cc00 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
1cc10 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
1cc20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
1cc30 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
1cc40 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1cc50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
1cc60 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
1cc70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
1cc80 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
1cc90 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1cca0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
1ccb0 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
1ccc0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1ccd0 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
1cce0 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
1ccf0 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65  **.**  (21)  The
1cd00 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1cd10 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1cd20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cd30 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1cd40 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1cd50 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1cd60 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1cd70 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1cd80 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1cd90 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1cda0 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74  (23)  The parent
1cdb0 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1cdc0 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20  ive CTE, or the 
1cdd0 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1cde0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d   a.**        com
1cdf0 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69  pound query. Thi
1ce00 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1ce10 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1ce20 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1ce30 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1ce40 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1ce50 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1ce60 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1ce70 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1ce80 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1ce90 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1cea0 2a 20 20 28 32 34 29 20 20 54 68 65 20 73 75 62  *  (24)  The sub
1ceb0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1cec0 61 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75  aggregate that u
1ced0 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  ses the built-in
1cee0 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20   min() or .**   
1cef0 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75       or max() fu
1cf00 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f  nctions.  (Witho
1cf10 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1cf20 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b  ion, a query lik
1cf30 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45  e:.**        "SE
1cf40 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c  LECT x FROM (SEL
1cf50 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52  ECT max(y), x FR
1cf60 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f  OM t1)" would no
1cf70 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a  t necessarily.**
1cf80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
1cf90 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77  he value X for w
1cfa0 68 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d  hich Y was maxim
1cfb0 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e  al.).**.**.** In
1cfc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1cfd0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
1cfe0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1cff0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d000 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
1d010 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
1d020 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
1d030 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
1d040 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
1d050 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
1d060 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
1d070 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
1d080 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1d090 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1d0a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1d0b0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1d0c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1d0d0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1d0e0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1d0f0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1d100 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1d110 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1d120 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1d130 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1d140 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1d150 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1d160 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1d170 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1d180 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1d190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d1a0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1d1b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1d1c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1d1d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1d1e0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1d1f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1d200 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1d210 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1d220 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1d230 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1d240 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1d250 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1d260 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1d270 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
1d280 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1d290 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1d2a0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1d2b0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
1d2c0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
1d2d0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1d2e0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1d2f0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
1d300 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d310 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1d320 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1d330 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
1d340 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f  t *pParent;    /
1d350 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20  * Current UNION 
1d360 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ALL term of the 
1d370 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  other query */. 
1d380 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
1d390 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
1d3a0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
1d3b0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
1d3c0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
1d3d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
1d3e0 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
1d3f0 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
1d400 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1d410 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
1d420 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1d430 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d440 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
1d450 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
1d460 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d470 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
1d480 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
1d490 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
1d4a0 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
1d4b0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
1d4c0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
1d4d0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1d4e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
1d4f0 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
1d500 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
1d510 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1d520 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1d530 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
1d540 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
1d550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1d560 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1d570 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d580 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
1d590 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1d5a0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1d5b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d5c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1d5d0 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
1d5e0 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1d5f0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
1d600 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1d610 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
1d620 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
1d630 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
1d640 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
1d650 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
1d660 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1d670 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1d680 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1d690 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1d6a0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1d6b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1d6c0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1d6d0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1d6e0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1d6f0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1d700 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1d710 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1d720 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1d730 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1d740 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1d750 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
1d760 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
1d770 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  isAgg ) return 0
1d780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d7b0 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  (1)   */.    if(
1d7c0 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1d7d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d800 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66   (2a)  */.    if
1d810 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20  ( (p->pWhere && 
1d820 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d830 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62  p->pWhere,EP_Sub
1d840 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20  query)).     || 
1d850 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1d860 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29  Flags(p->pEList)
1d870 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1d880 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  =0.     || (sqli
1d890 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1d8a0 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20  (p->pOrderBy) & 
1d8b0 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a  EP_Subquery)!=0.
1d8c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1d8d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d910 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  2b)  */.    }.  
1d920 7d 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72 63  }.    .  pSubSrc
1d930 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1d940 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1d950 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1d960 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1d970 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1d980 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1d990 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1d9a0 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1d9b0 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1d9c0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
1d9d0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
1d9e0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1d9f0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
1da00 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
1da10 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
1da20 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
1da30 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1da40 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
1da50 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1da60 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
1da70 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
1da80 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
1da90 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
1daa0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dab0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
1dac0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dad0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dae0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
1daf0 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
1db00 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1db30 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
1db40 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1db50 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
1db60 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
1db70 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
1db80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbb0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dbc0 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
1dbd0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
1dbe0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dc10 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
1dc20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1dc30 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
1dc40 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dc50 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dc60 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (5)  */.  if( 
1dc70 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dc80 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
1dc90 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
1dca0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dcb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1dcc0 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
1dcd0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1dce0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1dcf0 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
1dd00 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
1dd10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dd20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1dd30 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
1dd40 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
1dd50 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1dd60 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dda0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
1ddb0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
1ddc0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
1ddd0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ddf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1de00 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
1de10 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1de20 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
1de30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1de40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1de50 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
1de60 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
1de70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1de80 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
1de90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1dea0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1deb0 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
1dec0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1ded0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1dee0 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74  Recursive );.  t
1def0 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73  estcase( pSub->s
1df00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e  elFlags & SF_Min
1df10 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20  MaxAgg );.  if( 
1df20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1df30 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53   (SF_Recursive|S
1df40 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a  F_MinMaxAgg) ){.
1df50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1df60 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32   Restrictions (2
1df70 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20  2) and (24) */. 
1df80 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1df90 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1dfa0 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1dfb0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Prior ){.    ret
1dfc0 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
1dfd0 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20  ction (23) */.  
1dfe0 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45  }..  /* OBSOLETE
1dff0 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a   COMMENT 1:.  **
1e000 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
1e010 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1e020 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
1e030 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1e040 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
1e050 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
1e060 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
1e070 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
1e080 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1e090 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
1e0a0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1e0b0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1e0c0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
1e0d0 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
1e0e0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
1e0f0 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
1e100 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
1e110 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
1e120 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
1e130 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
1e140 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
1e150 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
1e160 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
1e170 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ** OBSOLETE COMM
1e180 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 2:.  ** Rest
1e190 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20  riction 12:  If 
1e1a0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1e1b0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1e1c0 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
1e1d0 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b  r.  ** join, mak
1e1e0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1e1f0 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
1e200 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e   clause..  ** An
1e210 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   examples of why
1e220 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c   this is not all
1e230 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1e240 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1e250 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45  OUTER JOIN (SELE
1e260 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
1e270 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a  RE t2.x>0).  **.
1e280 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1e290 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1e2a0 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1e2b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1e2c0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1e2d0 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e   t2) WHERE t2.x>
1e2e0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20  0.  **.  ** But 
1e2f0 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20  the t2.x>0 test 
1e300 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
1e310 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f   on a NULL row o
1e320 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a  f t2, which.  **
1e330 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e   effectively con
1e340 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20  verts the OUTER 
1e350 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e  JOIN into an INN
1e360 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20  ER JOIN..  **.  
1e370 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45  ** THIS OVERRIDE
1e380 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  S OBSOLETE COMME
1e390 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56  NTS 1 AND 2 ABOV
1e3a0 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  E:.  ** Ticket #
1e3b0 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20  3300 shows that 
1e3c0 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72  flattening the r
1e3d0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1e3e0 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73  EFT JOIN.  ** is
1e3f0 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61   fraught with da
1e400 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61  nger.  Best to a
1e410 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74  void the whole t
1e420 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20  hing.  If the.  
1e430 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74  ** subquery is t
1e440 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
1e450 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
1e460 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
1e470 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  n..  */.  if( (p
1e480 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
1e490 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1e4a0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1e4b0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
1e4c0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1e4d0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e4e0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1e4f0 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1e500 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1e510 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1e520 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1e530 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1e540 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1e550 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1e560 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1e570 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1e580 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1e590 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1e5a0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1e5b0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1e5c0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1e5d0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1e5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1e5f0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e600 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1e610 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1e620 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1e630 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1e640 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1e650 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e660 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1e670 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1e680 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1e690 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1e6a0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1e6b0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1e6c0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1e6d0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1e6e0 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1e6f0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1e700 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1e710 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1e720 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1e730 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1e740 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1e750 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1e760 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  t( pSub->pEList-
1e770 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70  >nExpr==pSub1->p
1e780 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1e790 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
1e7a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e7b0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e7c0 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20  regate))!=0.    
1e7d0 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
1e7e0 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
1e7f0 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20  p!=TK_ALL) .    
1e800 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
1e810 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20  c->nSrc<1.      
1e820 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e830 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1e840 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
1e850 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
1e860 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
1e870 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
1e880 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1e890 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1e8a0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1e8b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
1e8c0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1e8d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1e8e0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
1e8f0 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
1e900 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
1e910 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1e920 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a    }.  }..  /****
1e930 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1e940 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
1e950 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1e960 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
1e970 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
1e980 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
1e990 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
1e9a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e9b0 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
1e9c0 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
1e9d0 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
1e9e0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1e9f0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1ea00 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1ea10 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1ea20 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1ea30 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1ea40 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1ea50 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1ea60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1ea70 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1ea80 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ea90 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1eaa0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1eab0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1eac0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1ead0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1eae0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1eaf0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1eb00 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1eb10 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1eb20 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1eb30 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1eb40 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1eb50 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1eb60 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1eb70 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1eb80 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1eb90 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1eba0 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1ebb0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1ebc0 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1ebd0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1ebe0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1ebf0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1ec00 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1ec10 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1ec20 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1ec30 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1ec40 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1ec50 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1ec60 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1ec70 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1ec80 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1ec90 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1eca0 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1ecb0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1ecc0 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1ecd0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1ece0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1ecf0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1ed00 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1ed10 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1ed20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1ed30 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1ed40 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1ed50 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1ed60 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1ed70 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1ed80 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ed90 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1eda0 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1edb0 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1edc0 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1edd0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1ede0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1edf0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ee00 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1ee10 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1ee20 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1ee30 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1ee40 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1ee50 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1ee60 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1ee70 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1ee80 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1ee90 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1eea0 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1eeb0 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1eec0 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1eed0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1eee0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1eef0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1ef00 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1ef10 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1ef20 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1ef30 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1ef40 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1ef50 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1ef60 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1ef70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1ef80 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1ef90 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1efa0 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1efb0 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1efc0 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1efd0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1efe0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1eff0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1f000 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1f010 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1f020 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1f030 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1f040 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1f050 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
1f060 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75  etName(pNew, pSu
1f070 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  b->zSelName);.  
1f080 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1f090 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1f0a0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1f0b0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1f0c0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1f0d0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1f0e0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1f0f0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
1f100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1f110 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1f120 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f130 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1f140 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
1f150 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
1f160 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
1f170 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
1f180 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
1f190 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1f1a0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
1f1b0 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20  CE(2,pParse,p,. 
1f1c0 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75          ("compou
1f1d0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1f1e0 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25 73  tener creates %s
1f1f0 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a  .%p as peer\n",.
1f200 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a           pNew->z
1f210 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b  SelName, pNew));
1f220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1f230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f240 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1f250 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
1f260 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
1f270 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
1f280 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
1f290 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
1f2a0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
1f2b0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
1f2c0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1f2d0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
1f2e0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1f2f0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
1f300 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f310 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
1f320 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
1f330 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f340 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
1f350 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f360 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
1f370 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f380 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1f390 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
1f3a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f3b0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f3c0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
1f3d0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
1f3e0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
1f3f0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
1f400 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
1f410 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1f420 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1f430 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1f440 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
1f450 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
1f460 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
1f470 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
1f480 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
1f490 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
1f4a0 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
1f4b0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
1f4c0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
1f4d0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
1f4e0 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
1f4f0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
1f500 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
1f510 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
1f520 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
1f530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
1f540 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
1f550 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
1f560 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
1f570 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
1f580 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
1f590 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
1f5a0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
1f5b0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1f5c0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1f5d0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
1f5e0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
1f5f0 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
1f600 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
1f610 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
1f620 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
1f630 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
1f640 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1f650 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
1f660 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
1f670 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
1f680 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
1f690 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1f6a0 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
1f6b0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1f6c0 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
1f6d0 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
1f6e0 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
1f6f0 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
1f700 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
1f710 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
1f720 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
1f730 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
1f740 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1f750 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
1f760 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
1f770 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
1f780 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
1f790 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
1f7a0 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1f7b0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1f7c0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1f7d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f7e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f7f0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1f800 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1f810 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1f820 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1f830 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1f840 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1f850 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1f860 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1f870 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1f880 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1f890 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1f8a0 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1f8b0 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1f8c0 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1f8d0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1f8e0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1f8f0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1f900 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1f910 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1f920 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1f930 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1f940 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1f950 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
1f960 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
1f970 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
1f980 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
1f990 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
1f9a0 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
1f9b0 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
1f9c0 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1f9d0 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
1f9e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1f9f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
1fa00 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1fa10 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
1fa20 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1fa30 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
1fa40 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
1fa50 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1fa60 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1fa70 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1fa80 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
1fa90 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
1faa0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1fab0 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
1fac0 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
1fad0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1fae0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1faf0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
1fb00 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1fb10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1fb20 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
1fb30 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1fb40 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
1fb50 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1fb60 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1fb70 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
1fb80 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1fb90 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1fba0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
1fbb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1fbc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fbd0 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
1fbe0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fbf0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
1fc00 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
1fc10 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
1fc20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fc30 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
1fc40 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
1fc50 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
1fc60 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
1fc70 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
1fc80 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
1fc90 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
1fca0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
1fcb0 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
1fcc0 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
1fcd0 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
1fce0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1fcf0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1fd00 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1fd10 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1fd20 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
1fd30 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
1fd40 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
1fd50 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
1fd60 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
1fd70 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
1fd80 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
1fd90 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
1fda0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
1fdb0 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
1fdc0 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
1fdd0 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
1fde0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
1fdf0 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
1fe00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fe10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
1fe20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
1fe30 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
1fe40 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
1fe50 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
1fe60 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
1fe70 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
1fe80 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1fe90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1fea0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1feb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1fec0 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
1fed0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
1fee0 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
1fef0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1ff00 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
1ff10 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
1ff20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1ff30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1ff40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ff50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ff60 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
1ff70 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
1ff80 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
1ff90 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
1ffa0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1ffb0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1ffc0 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1ffd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ffe0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1fff0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
20000 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
20010 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
20020 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54  [i+iFrom].fg.isT
20030 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
20040 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
20050 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
20060 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
20070 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
20080 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
20090 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
200a0 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
200b0 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  From].fg.jointyp
200c0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
200d0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
200e0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
200f0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
20100 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
20110 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
20120 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
20130 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
20140 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
20150 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
20160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
20170 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
20180 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
20190 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
201a0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
201b0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
201c0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
201d0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
201e0 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
201f0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
20200 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
20210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20220 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
20230 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
20240 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20250 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
20260 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
20270 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
20280 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20290 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
202a0 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
202b0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
202c0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
202d0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
202e0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
202f0 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
20300 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
20310 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
20320 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
20330 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
20340 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
20350 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
20360 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
20370 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
20380 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
20390 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
203a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
203b0 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
203c0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
203d0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
203e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
203f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20400 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20410 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20420 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20430 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
20440 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20450 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
20460 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
20470 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
20480 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
20490 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
204a0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
204b0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
204c0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
204d0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
204e0 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
204f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20500 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20510 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20520 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20530 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
20540 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
20550 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
20560 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
20570 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20580 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
20590 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
205a0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
205b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
205c0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
205d0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
205e0 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
205f0 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20600 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20610 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20620 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20630 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
20640 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
20650 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
20660 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
20670 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
20680 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
20690 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
206a0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
206b0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
206c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
206d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
206e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
206f0 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20700 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20720 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20730 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
20740 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
20750 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
20760 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
20770 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
20780 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
20790 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
207a0 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20   }.    pWhere = 
207b0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
207c0 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
207d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 75 62   0);.    if( sub
207e0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
207f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
20800 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
20810 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
20820 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
20830 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
20840 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20850 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
20860 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
20870 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
20880 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
20890 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
208c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
208d0 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
208e0 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
208f0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
20900 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
20910 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20920 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
20930 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
20940 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
20950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20960 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
20970 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
20980 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
20990 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
209a0 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 53      }.    substS
209b0 65 6c 65 63 74 28 64 62 2c 20 70 50 61 72 65 6e  elect(db, pParen
209c0 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
209d0 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
209e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
209f0 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
20a00 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
20a10 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
20a20 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20a30 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
20a40 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
20a50 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
20a60 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
20a70 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
20a80 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
20a90 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
20aa0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
20ab0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
20ac0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
20ad0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
20ae0 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
20af0 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
20b00 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
20b10 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
20b20 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
20b30 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
20b40 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
20b50 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
20b60 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
20b70 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
20b80 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
20b90 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
20ba0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
20bb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20bc0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
20bd0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
20be0 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
20bf0 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
20c00 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
20c10 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
20c20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
20c30 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
20c40 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
20c50 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
20c60 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
20c70 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
20c80 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
20c90 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
20ca0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
20cb0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
20cc0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
20cd0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20ce0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
20cf0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
20d00 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20d10 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20d20 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
20d30 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
20d40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
20d50 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
20d60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20d70 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  VIEW)./*.** Make
20d80 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76   copies of relev
20d90 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ant WHERE clause
20da0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75   terms of the ou
20db0 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a  ter query into.*
20dc0 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
20dd0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20  se of subquery. 
20de0 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
20df0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
20e00 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
20e10 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
20e20 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44  1) WHERE x=5 AND
20e30 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61   y=10;.**.** Tra
20e40 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a  nsformed into:.*
20e50 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
20e60 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
20e70 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
20e80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
20e90 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20   AND c-d=10).** 
20ea0 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e      WHERE x=5 AN
20eb0 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68  D y=10;.**.** Th
20ec0 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74  e hope is that t
20ed0 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74  he terms added t
20ee0 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  o the inner quer
20ef0 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d  y will make it m
20f00 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74  ore.** efficient
20f10 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ..**.** Do not a
20f20 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69  ttempt this opti
20f30 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a  mization if:.**.
20f40 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e  **   (1) The inn
20f50 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61  er query is an a
20f60 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74  ggregate.  (In t
20f70 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72  hat case, we'd r
20f80 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20  eally want.**   
20f90 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20      to copy the 
20fa0 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  outer WHERE-clau
20fb0 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  se terms onto th
20fc0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
20fd0 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
20fe0 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75  inner query.  Bu
20ff0 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20  t they probably 
21000 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65  won't help there
21010 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65   so do not bothe
21020 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  r.).**.**   (2) 
21030 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21040 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  is the recursive
21050 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f   part of a commo
21060 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
21070 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  on..**.**   (3) 
21080 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21090 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  has a LIMIT clau
210a0 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68  se (since the ch
210b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
210c0 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73  RE.**       clos
210d0 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
210e0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
210f0 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
21100 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
21110 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21120 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21130 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65  LEFT JOIN.  (The
21140 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20   caller.**      
21150 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72   enforces this r
21160 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65  estriction since
21170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
21180 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75  es not have enou
21190 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f  gh.**       info
211a0 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e  rmation to know.
211b0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ).**.**   (5) Th
211c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
211d0 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
211e0 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
211f0 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
21200 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
21210 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65  T JOIN..**.** Re
21220 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61  turn 0 if no cha
21230 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e  nges are made an
21240 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e  d non-zero if on
21250 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20  e or more WHERE 
21260 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20  clause.** terms 
21270 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69  are duplicated i
21280 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79  nto the subquery
21290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
212a0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
212b0 6d 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms(.  sqlite3 *d
212c0 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  b,          /* T
212d0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
212e0 65 63 74 69 6f 6e 20 28 66 6f 72 20 6d 61 6c 6c  ection (for mall
212f0 6f 63 28 29 29 20 2a 2f 0a 20 20 53 65 6c 65 63  oc()) */.  Selec
21300 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
21310 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21320 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
21330 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
21340 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
21350 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
21360 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
21370 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
21380 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
21390 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20  t iCursor       
213a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
213b0 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
213c0 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uery */.){.  Exp
213d0 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
213e0 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Chng = 0;.  if( 
213f0 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
21400 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 53 75  rn 0;.  if( (pSu
21410 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  bq->selFlags & (
21420 53 46 5f 41 67 67 72 65 67 61 74 65 7c 53 46 5f  SF_Aggregate|SF_
21430 52 65 63 75 72 73 69 76 65 29 29 21 3d 30 20 29  Recursive))!=0 )
21440 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21450 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73   /* restrictions
21460 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a   (1) and (2) */.
21470 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d    }.  if( pSubq-
21480 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20  >pLimit!=0 ){.  
21490 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
214a0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
214b0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
214c0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
214d0 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
214e0 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
214f0 54 65 72 6d 73 28 64 62 2c 20 70 53 75 62 71 2c  Terms(db, pSubq,
21500 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c   pWhere->pRight,
21510 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70   iCursor);.    p
21520 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
21530 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
21540 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
21550 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
21560 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
21570 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
21580 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  5 */.  if( sqlit
21590 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
215a0 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
215b0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
215c0 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
215d0 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
215e0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
215f0 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
21600 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  e, 0);.      pNe
21610 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  w = substExpr(db
21620 2c 20 70 4e 65 77 2c 20 69 43 75 72 73 6f 72 2c  , pNew, iCursor,
21630 20 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 29 3b   pSubq->pEList);
21640 0a 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57  .      pSubq->pW
21650 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21660 70 72 41 6e 64 28 64 62 2c 20 70 53 75 62 71 2d  prAnd(db, pSubq-
21670 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a  >pWhere, pNew);.
21680 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53        pSubq = pS
21690 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ubq->pPrior;.   
216a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
216b0 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20  nChng;.}.#endif 
216c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
216d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
216e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
216f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
21700 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
21710 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
21720 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
21730 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
21740 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
21750 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
21760 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
21770 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
21780 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
21790 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
217a0 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
217b0 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
217c0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
217d0 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
217e0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
217f0 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
21800 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
21810 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
21820 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21830 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
21840 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
21850 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
21860 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
21870 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
21880 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
21890 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
218a0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
218b0 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
218c0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
218d0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
218e0 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
218f0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
21900 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
21910 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21920 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
21930 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
21940 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
21950 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
21960 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
21970 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21980 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
21990 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
219a0 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
219b0 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
219c0 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
219d0 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
219e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
219f0 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
21a00 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
21a10 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
21a20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
21a30 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
21a40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
21a50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
21a60 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
21a70 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
21a80 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
21a90 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
21aa0 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
21ab0 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
21ac0 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
21ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
21ae0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
21af0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
21b00 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
21b10 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
21b20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
21b30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21b40 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
21b50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
21b60 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
21b70 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
21b80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
21b90 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
21ba0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21bb0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21bc0 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
21bd0 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21be0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21bf0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21c00 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
21c10 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
21c20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
21c30 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
21c40 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
21c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21c60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
21c70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
21c80 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
21c90 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
21ca0 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
21cb0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
21cc0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
21cd0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21ce0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21cf0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
21d00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
21d10 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
21d20 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
21d30 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
21d40 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
21d50 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
21d60 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
21d70 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
21d80 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
21d90 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
21da0 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
21db0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
21dc0 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
21dd0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
21de0 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
21df0 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
21e00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21e10 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
21e20 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
21e30 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
21e40 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
21e50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21e60 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
21e70 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
21e80 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
21e90 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
21ea0 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
21eb0 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
21ec0 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
21ed0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
21ee0 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
21ef0 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
21f00 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
21f10 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
21f20 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
21f30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21f40 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
21f50 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
21f60 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
21f70 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
21f80 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
21f90 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
21fa0 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
21fb0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
21fc0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
21fd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
21fe0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
21ff0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
22000 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
22010 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
22020 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
22030 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
22040 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
22050 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
22060 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
22070 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
22080 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
22090 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
220a0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
220b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
220c0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
220d0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
220e0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
220f0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
22100 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
22110 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
22120 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
22130 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
22140 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
22150 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
22160 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
22170 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
22180 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
22190 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
221a0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
221b0 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
221c0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
221d0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
221e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
221f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
22200 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
22210 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
22220 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22230 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
22240 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
22250 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
22260 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
22270 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
22280 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
22290 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
222a0 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
222b0 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
222c0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
222d0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
222e0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
222f0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
22300 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
22310 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
22320 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
22330 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
22340 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
22350 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22360 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
22370 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
22380 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
22390 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
223a0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
223b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
223c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
223d0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
223e0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
223f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22400 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
22410 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
22420 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
22430 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
22440 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
22450 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
22460 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22470 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
22480 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22490 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
224a0 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
224b0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
224c0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
224d0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
224e0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
224f0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22500 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
22510 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
22520 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
22530 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
22540 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
22550 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
22560 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
22570 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
22580 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
22590 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
225a0 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
225b0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
225c0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
225d0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
225e0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
225f0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
22600 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
22610 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
22620 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
22630 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
22640 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
22650 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
22660 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
22670 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
22680 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
22690 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
226a0 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
226b0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
226c0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
226d0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
226e0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
226f0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
22700 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
22710 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
22720 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
22730 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
22740 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
22750 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
22760 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
22770 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
22780 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
22790 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
227a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
227b0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
227c0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
227d0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
227e0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
227f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
22800 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
22810 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
22820 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
22830 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
22840 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
22850 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
22860 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
22870 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22880 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
22890 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
228a0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
228b0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
228c0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
228d0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
228e0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
228f0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
22900 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
22910 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
22920 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
22930 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
22940 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
22950 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
22960 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
22970 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
22980 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
22990 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
229a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
229b0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
229c0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
229d0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
229e0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
229f0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
22a00 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
22a10 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22a20 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22a30 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
22a40 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
22a50 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
22a60 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
22a70 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
22a80 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
22a90 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
22aa0 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
22ab0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
22ac0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
22ad0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
22ae0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
22af0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
22b00 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
22b10 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
22b20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
22b30 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
22b40 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
22b50 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b  K_ASTERISK, 0));
22b60 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
22b70 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
22b80 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
22b90 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
22ba0 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
22bb0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
22bc0 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
22bd0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e  ior = 0;.  p->pN
22be0 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57  ext = 0;.  p->pW
22bf0 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65  ith = 0;.  p->se
22c00 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
22c10 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74  mpound;.  assert
22c20 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
22c30 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d   SF_Converted)==
22c40 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
22c50 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74  gs |= SF_Convert
22c60 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  ed;.  assert( pN
22c70 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
22c80 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
22c90 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22ca0 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
22cb0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
22cc0 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
22cd0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22ce0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
22cf0 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d   see if the FROM
22d00 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72   clause term pFr
22d10 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c  om has table-val
22d20 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ued function.** 
22d30 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69  arguments.  If i
22d40 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e  t does, leave an
22d50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
22d60 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
22d70 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
22d80 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20   since pFrom is 
22d90 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
22da0 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  e a table-valued
22db0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
22dc0 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42  atic int cannotB
22dd0 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  eFunction(Parse 
22de0 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
22df0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22e00 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
22e10 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
22e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
22e30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22e40 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75  '%s' is not a fu
22e50 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e  nction", pFrom->
22e60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
22e70 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
22e80 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn 0;.}..#ifndef
22e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22ea0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
22eb0 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
22ec0 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
22ed0 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
22ee0 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
22ef0 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
22f00 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
22f10 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
22f20 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
22f30 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
22f40 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
22f50 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
22f60 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
22f70 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
22f80 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
22f90 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
22fa0 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
22fb0 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
22fc0 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
22fd0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
22fe0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
22ff0 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
23000 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
23010 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
23020 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
23030 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
23040 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
23050 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
23060 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
23070 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72  /* Current inner
230a0 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
230b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
230c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
230d0 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
230e0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
230f0 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
23100 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23120 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
23130 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
23140 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
23150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
23160 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
23170 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
23180 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
23190 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
231a0 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
231b0 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
231c0 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
231d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
231e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
231f0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
23200 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23210 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
23220 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23230 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
23240 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
23250 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
23260 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
23270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23280 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23290 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
232a0 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
232b0 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
232c0 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
232d0 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
232e0 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
232f0 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
23300 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
23310 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23320 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
23330 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
23340 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23350 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
23360 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
23370 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
23380 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
23390 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
233a0 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
233b0 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
233c0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
233d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
233e0 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
233f0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
23400 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
23410 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
23420 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
23430 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
23440 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
23450 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23460 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
23470 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
23480 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
23490 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
234a0 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
234b0 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
234c0 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
234d0 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
234e0 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e  ==0 || (pParse->
234f0 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72  pWith==0 && pPar
23500 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d  se->pWithToFree=
23510 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69  =0) );.  if( pWi
23520 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  th ){.    assert
23530 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21  ( pParse->pWith!
23540 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57  =pWith );.    pW
23550 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
23560 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
23570 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
23580 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
23590 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e  bFree ) pParse->
235a0 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57  pWithToFree = pW
235b0 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ith;.  }.}../*.*
235c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
235d0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
235e0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
235f0 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
23600 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
23610 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
23620 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
23630 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
23640 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
23650 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
23660 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
23670 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
23680 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
23690 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
236a0 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
236b0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
236c0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
236d0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
236e0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
236f0 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
23700 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
23710 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
23720 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
23730 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
23740 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
23750 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
23760 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
23770 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
23780 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
23790 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
237a0 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
237b0 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
237c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
237d0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
237e0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
237f0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
23800 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23810 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
23820 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
23830 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
23840 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
23850 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
23860 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
23870 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
23880 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
23890 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
238a0 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
238b0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
238c0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
238d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
238e0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
238f0 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
23900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23910 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
23920 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
23930 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
23940 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
23950 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
23960 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
23970 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
23980 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23990 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
239a0 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
239b0 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
239c0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
239d0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
239e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
239f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
23a00 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
23a10 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
23a20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
23a30 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
23a40 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
23a50 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
23a60 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
23a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23a80 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
23a90 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
23aa0 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
23ab0 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
23ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
23ad0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
23ae0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
23af0 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
23b00 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  CteErr is non-NU
23b10 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
23b20 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
23b30 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
23b40 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23b50 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
23b60 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
23b70 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23b80 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
23b90 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74  ly. If pCte->zCt
23ba0 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  eErr is NULL, th
23bb0 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
23bc0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
23bd0 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
23be0 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
23bf0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
23c00 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b  pCte->zCteErr ){
23c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23c20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
23c30 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43  Cte->zCteErr, pC
23c40 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23c60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23c70 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e   if( cannotBeFun
23c80 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
23c90 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51  rom) ) return SQ
23ca0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20  LITE_ERROR;..   
23cb0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23cc0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pTab==0 );.    p
23cd0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
23ce0 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
23cf0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
23d00 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
23d10 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
23d20 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23d30 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
23d40 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
23d50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
23d60 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
23d70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
23d80 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
23d90 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
23da0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
23db0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
23dc0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
23dd0 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
23de0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
23df0 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
23e00 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
23e10 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
23e20 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
23e30 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
23e40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
23e50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
23e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23e70 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74  OMEM;.    assert
23e80 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
23e90 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
23ea0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
23eb0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
23ec0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
23ed0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
23ee0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
23ef0 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
23f00 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
23f10 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
23f20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
23f30 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
23f40 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
23f50 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
23f60 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
23f70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23f80 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
23f90 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
23fa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
23fb0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
23fc0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
23fd0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
23fe0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
23ff0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
24000 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
24010 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
24020 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
24030 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
24040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24050 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
24060 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
24070 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
24080 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
24090 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
240a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
240b0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
240c0 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
240d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
240e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
240f0 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
24100 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
24110 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
24120 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
24130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24140 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
24150 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
24160 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
24170 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
24180 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
24190 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
241a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
241b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
241c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
241d0 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
241e0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
241f0 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
24200 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
24210 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
24220 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
24230 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
24240 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
24250 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
24260 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24270 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73  h = pWith;.    s
24280 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24290 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65  (pWalker, bMayRe
242a0 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e  cursive ? pSel->
242b0 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a  pPrior : pSel);.
242c0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
242d0 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20  h = pWith;..    
242e0 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
242f0 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
24300 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
24310 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
24320 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
24330 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
24340 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
24350 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
24360 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
24370 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
24380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24390 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
243a0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
243b0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
243c0 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
243d0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
243e0 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
243f0 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
24400 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
24410 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
24420 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
24430 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
24440 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
24450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
24460 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
24470 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
24480 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
24490 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
244a0 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
244b0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
244c0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
244d0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
244e0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
244f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
24500 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
24510 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
24520 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75  = "multiple recu
24530 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73  rsive references
24540 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  : %s";.      }el
24550 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65  se{.        pCte
24560 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63  ->zCteErr = "rec
24570 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24580 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
24590 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
245a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
245b0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
245c0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
245d0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30  Cte->zCteErr = 0
245e0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
245f0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
24600 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
24620 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
24630 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
24640 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
24650 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
24660 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
24670 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
24680 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
24690 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
246a0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
246b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
246c0 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
246d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
246e0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
246f0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
24700 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
24710 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
24720 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
24730 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
24740 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
24750 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
24760 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
24770 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
24780 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
24790 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
247a0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
247b0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
247c0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
247d0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68  ->pParse;.  With
247e0 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
247f0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
24800 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d  h;.  if( pWith!=
24810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
24820 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
24830 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61  pWith );.    pPa
24840 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24850 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
24860 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
24870 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
24880 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
24890 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
248a0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
248b0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
248c0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
248d0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
248e0 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
248f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
24900 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
24910 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
24920 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
24930 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
24940 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
24950 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
24960 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
24970 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
24980 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
24990 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
249a0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
249b0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
249c0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
249d0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
249e0 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
249f0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
24a00 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
24a10 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
24a20 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
24a30 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24a40 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
24a50 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
24a60 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
24a70 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
24a80 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
24a90 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
24aa0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
24ab0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
24ac0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
24ad0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
24ae0 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
24af0 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
24b00 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
24b10 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
24b20 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
24b30 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
24b40 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
24b50 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
24b60 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
24b70 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
24b80 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
24b90 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
24ba0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
24bb0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
24bc0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
24bd0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
24be0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
24bf0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
24c00 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
24c10 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
24c20 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
24c30 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
24c40 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
24c50 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
24c60 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
24c70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
24c80 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
24c90 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
24ca0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
24cb0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
24cc0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
24cd0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
24ce0 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
24cf0 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
24d00 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
24d10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
24d20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
24d30 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
24d40 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
24d50 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
24d60 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
24d70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24d80 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
24d90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24da0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
24db0 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
24dc0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
24dd0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
24de0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
24df0 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
24e00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24e10 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
24e20 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24e30 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
24e40 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
24e50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
24e60 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
24e70 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
24e80 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
24e90 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
24ea0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
24eb0 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c 6b 65  st;.  if( pWalke
24ec0 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  r->xSelectCallba
24ed0 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70 57 69  ck2==selectPopWi
24ee0 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  th ){.    sqlite
24ef0 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65  3WithPush(pParse
24f00 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  , findRightmost(
24f10 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20  p)->pWith, 0);. 
24f20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
24f30 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
24f40 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
24f50 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
24f60 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
24f70 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
24f80 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
24f90 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
24fa0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
24fb0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
24fc0 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
24fd0 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
24fe0 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
24ff0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
25000 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
25010 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
25020 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
25030 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
25040 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
25050 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
25060 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
25070 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
25080 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
25090 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
250a0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
250b0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
250c0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
250d0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
250e0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
250f0 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
25100 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
25110 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
25120 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
25130 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
25140 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
25150 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25160 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
25170 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
25180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
25190 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
251a0 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
251b0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
251c0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
251d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
251e0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
251f0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
25200 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
25210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25220 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
25230 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
25240 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
25250 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
25260 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25270 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
25280 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
25290 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
252a0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
252b0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
252c0 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
252d0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
252e0 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
252f0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
25300 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
25310 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
25320 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
25330 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
25340 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
25350 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25360 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
25370 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
25380 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
25390 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
253a0 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
253b0 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
253c0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
253d0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
253e0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
253f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
25400 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
25410 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
25420 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
25430 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
25440 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
25450 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
25460 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
25470 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
25480 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
25490 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
254a0 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
254b0 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
254c0 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
254d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
254e0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
254f0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
25500 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25510 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
25520 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
25530 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
25540 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
25550 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25560 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
25570 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
25580 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
25590 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
255a0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
255b0 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
255c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
255d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
255e0 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
255f0 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
25600 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
25610 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
25620 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
25630 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
25640 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
25650 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
25660 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
25670 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
25680 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
25690 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  & cannotBeFuncti
256a0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
256b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
256c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
256d0 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69       }.#if !defi
256e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
256f0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
25700 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
25710 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
25720 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
25730 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e  (pTab) || pTab->
25740 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
25750 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20     i16 nCol;.   
25760 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25770 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
25780 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
25790 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
257a0 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
257b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
257c0 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
257d0 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
257e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
257f0 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
25800 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
25810 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
25820 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70  SetName(pFrom->p
25830 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e  Select, pTab->zN
25840 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  ame);.        nC
25850 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol = pTab->nCol;
25860 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
25870 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
25880 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
25890 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
258a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
258b0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
258c0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = nCol;.      }
258d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
258e0 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
258f0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
25900 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
25910 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
25920 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
25930 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
25940 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
25950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25960 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
25970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
25980 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
25990 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
259a0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
259b0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
259c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
259d0 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
259e0 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
259f0 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
25a00 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
25a10 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
25a20 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
25a30 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
25a40 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
25a50 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
25a60 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
25a70 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
25a80 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
25a90 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
25aa0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
25ab0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
25ac0 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
25ad0 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
25ae0 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
25af0 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  th the TK_ASTERI
25b00 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  SK operator for 
25b10 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
25b20 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
25b30 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20  lumn.  ** list. 
25b40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
25b50 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
25b60 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53  locate the TK_AS
25b70 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72  TERISK.  ** expr
25b80 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
25b90 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  nd each one to t
25ba0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
25bb0 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61  olumns in.  ** a
25bc0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
25bd0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
25be0 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
25bf0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
25c00 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
25c10 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
25c20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
25c30 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
25c40 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
25c50 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
25c60 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
25c70 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
25c80 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
25c90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
25ca0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
25cb0 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
25cc0 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
25cd0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
25ce0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
25cf0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
25d00 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
25d10 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
25d20 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
25d30 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ight->op==TK_AST
25d40 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
25d50 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
25d60 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
25d70 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
25d80 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
25d90 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
25da0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
25db0 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
25dc0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
25dd0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
25de0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
25df0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
25e00 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
25e10 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
25e20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
25e30 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
25e40 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
25e50 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
25e60 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
25e70 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
25e80 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
25e90 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
25ea0 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
25eb0 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
25ec0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
25ed0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
25ef0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25f00 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
25f10 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
25f20 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
25f30 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
25f40 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
25f50 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
25f60 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
25f70 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
25f80 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
25f90 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
25fa0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ( pE->op!=TK_AST
25fb0 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20  ERISK.       && 
25fc0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
25fd0 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  || pRight->op!=T
25fe0 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20  K_ASTERISK).    
25ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
26000 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
26010 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
26020 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
26030 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
26040 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
26050 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
26060 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
26070 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
26080 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
26090 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
260a0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
260b0 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
260c0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
260d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
260e0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
260f0 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
26100 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
26110 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
26120 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
26130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
26140 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
26150 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
26160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
26170 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
26180 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
26190 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
261a0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
261b0 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
261c0 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
261d0 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
261e0 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
261f0 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
26200 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
26210 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
26220 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
26230 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
26240 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
26250 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
26260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
26270 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
26280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26290 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
262a0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
262b0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
262c0 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
262d0 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
262e0 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
262f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
26300 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
26310 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
26320 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
26330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
26340 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
26350 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
26360 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
26370 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26380 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
26390 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
263a0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
263b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
263c0 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
263d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
263e0 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
263f0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
26400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
26410 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
26420 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
26430 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
26440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26450 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
26460 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
26470 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
26480 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
26490 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
264a0 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
264b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
264c0 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
264d0 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
264e0 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
264f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
26500 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
26510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26520 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
26530 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
26540 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
26550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
26560 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
26570 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
26580 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
26590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
265a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
265b0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
265c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
265d0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
265e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
265f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
26600 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
26610 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
26620 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
26630 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
26640 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
26650 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
26660 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
26670 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
26680 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
26690 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
266a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
266b0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
266c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
266d0 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
266e0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
266f0 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
26700 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
26710 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
26720 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
26730 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
26740 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
26750 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26760 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26770 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
26780 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
26790 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
267a0 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f  d as 'hidden', o
267b0 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20  mit it from the 
267c0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
267d0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
267e0 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74  et list unless t
267f0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68  he SELECT has th
26800 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  e SF_IncludeHidd
26810 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  en.            *
26820 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20  * bit set..     
26830 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26840 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65        if( (p->se
26850 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c  lFlags & SF_Incl
26860 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20  udeHidden)==0.  
26870 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73             && Is
26880 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
26890 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20  ab->aCol[j]) .  
268a0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
268b0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
268c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
268d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
268e0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
268f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
26900 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
26910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26920 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e   if( (pFrom->fg.
26930 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
26940 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
26950 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
26960 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
26970 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
26980 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
26990 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
269a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
269b0 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
269c0 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
269d0 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
269e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
269f0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
26a00 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
26a10 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
26a20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26a50 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
26a60 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
26a70 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
26a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26a90 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
26aa0 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
26ab0 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
26ac0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
26ad0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
26ae0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
26af0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
26b00 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
26b10 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
26b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26b30 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
26b40 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
26b50 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
26b60 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
26b70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26b80 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
26b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
26ba0 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
26bb0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
26bc0 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
26bd0 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
26be0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
26bf0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
26c00 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
26c10 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
26c20 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
26c40 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
26c50 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
26c60 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
26c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
26c80 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61     if( zSchemaNa
26c90 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
26ca0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
26cb0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
26cc0 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65  _ID, zSchemaName
26cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26ce0 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
26cf0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
26d00 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
26d10 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
26d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26d30 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
26d40 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
26d50 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
26d60 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
26d70 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
26d80 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
26d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26da0 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
26db0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
26dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26de0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
26df0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
26e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26e10 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
26e20 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
26e30 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
26e40 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
26e50 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f  sColname.z = zCo
26e60 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
26e70 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20     sColname.n = 
26e80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
26e90 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
26ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26eb0 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
26ec0 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
26ed0 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
26ee0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
26ef0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
26f00 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
26f10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
26f20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
26f30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
26f40 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
26f50 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
26f60 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
26f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26f80 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
26f90 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
26fa0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
26fb0 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
26fd0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
26fe0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
26ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
27010 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
27020 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
27030 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27060 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
27070 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
27080 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
27090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
270a0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
270d0 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
270e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
270f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27100 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
27110 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
27120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27130 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
27140 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
27150 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
27160 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27170 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27180 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
27190 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
271a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
271b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
271c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
271d0 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
271e0 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
271f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27210 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
27220 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
27230 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
27240 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
27250 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
27260 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
27270 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
27280 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
27290 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
272a0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
272b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
272c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
272d0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
272e0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
272f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27300 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ort;.  }.#endif.
27310 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
27320 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27330 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
27340 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
27350 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
27360 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27370 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
27380 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
27390 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
273a0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
273b0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
273c0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
273d0 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
273e0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
273f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
27400 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
27410 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
27420 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
27430 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
27440 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
27450 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
27460 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
27470 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
27480 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
27490 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
274a0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
274b0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
274c0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
274d0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
274e0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
274f0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
27500 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
27510 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
27520 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
27530 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
27540 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
27550 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
27560 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
27570 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
27580 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
27590 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
275a0 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
275b0 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
275c0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
275d0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
275e0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
275f0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
27600 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
27610 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
27620 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
27630 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
27640 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27650 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
27660 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
27670 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
27680 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
27690 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
276a0 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
276b0 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
276c0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
276d0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
276e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
276f0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
27700 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
27710 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
27720 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
27730 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
27740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27750 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27760 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
27770 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27780 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
27790 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
277a0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
277b0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
277c0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
277d0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
277e0 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
277f0 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
27800 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
27810 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
27820 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
27830 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
27840 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27850 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
27860 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
27870 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
27880 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
27890 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  if( (pSelect->se
278a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
278b0 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20  iValue)==0 ){.  
278c0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
278d0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
278e0 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  With;.  }.  sqli
278f0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
27900 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
27910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27920 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
27930 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
27940 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
27950 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
27960 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
27970 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
27980 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
27990 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
279a0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
279b0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
279c0 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
279d0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
279e0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
279f0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
27a00 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
27a10 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
27a20 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
27a30 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
27a40 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
27a50 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
27a60 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
27a70 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
27a80 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
27a90 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
27aa0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
27ab0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
27ac0 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
27ad0 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
27ae0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
27af0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
27b00 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
27b10 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
27b20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
27b30 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
27b40 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
27b50 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
27b60 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
27b70 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
27b80 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
27b90 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
27ba0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
27bb0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27bc0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
27bd0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
27be0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
27bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
27c00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
27c10 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b  sTypeInfo)==0 );
27c20 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
27c30 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
27c40 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
27c50 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
27c60 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
27c70 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
27c80 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
27c90 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
27ca0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
27cb0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
27cc0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
27cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
27ce0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
27cf0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
27d00 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
27d10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
27d20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
27d30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
27d40 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
27d50 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
27d60 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
27d70 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  t;.      if( pSe
27d80 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  l ){.        whi
27d90 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
27da0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
27db0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
27dc0 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
27dd0 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
27de0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
27df0 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
27e00 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
27e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
27e20 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79  tine adds dataty
27e30 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  pe and collating
27e40 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d   sequence inform
27e50 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  ation to.** the 
27e60 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73  Table structures
27e70 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   of all FROM-cla
27e80 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69  use subqueries i
27e90 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  n a.** SELECT st
27ea0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55  atement..**.** U
27eb0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
27ec0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
27ed0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
27ee0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
27ef0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50  ectAddTypeInfo(P
27f00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
27f10 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
27f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27f30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57  MIT_SUBQUERY.  W
27f40 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
27f50 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
27f60 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  w));.  w.xSelect
27f70 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
27f80 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
27f90 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
27fa0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
27fb0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
27fc0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
27fd0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
27fe0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
27ff0 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
28000 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
28010 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
28020 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28030 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
28040 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
28050 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
28060 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
28070 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
28080 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
28090 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
280a0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
280b0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
280c0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
280d0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
280e0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
280f0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
28100 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
28110 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
28120 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
28130 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
28140 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
28150 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
28160 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
28170 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
28180 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
28190 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
281a0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
281b0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
281c0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
281d0 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
281e0 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
281f0 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
28200 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28210 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
28220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
28230 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
28240 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
28250 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
28260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
28270 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
28280 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
28290 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
282a0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
282b0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
282c0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71  ainer */.){.  sq
282d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
282e0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
282f0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
28300 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
28310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28320 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
28330 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
28340 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
28350 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
28360 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
28370 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
28380 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
28390 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
283a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
283b0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
283c0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
283d0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
283e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
283f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
28400 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
28410 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
28420 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
28430 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
28440 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
28450 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
28460 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
28470 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
28480 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
28490 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
284a0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
284b0 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
284c0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
284d0 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
284e0 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
284f0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
28500 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
28510 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
28520 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
28530 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
28540 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
28550 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28560 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28570 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28580 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28590 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
285a0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
285b0 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
285c0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
285d0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
285e0 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
285f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
28600 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28610 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
28620 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
28630 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
28640 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
28650 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
28660 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
28670 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
28680 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
28690 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
286a0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
286b0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
286c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
286d0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
286e0 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
286f0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
28700 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
28710 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
28720 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
28730 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
28740 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
28750 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
28760 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
28770 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
28780 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
28790 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
287a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
287b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
287c0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
287d0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
287e0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
287f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
28800 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
28810 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
28820 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
28830 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
28840 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
28850 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
28860 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
28870 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
28880 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
28890 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
288a0 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
288b0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
288c0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
288d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
288e0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
288f0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
28900 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
28910 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
28920 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28930 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
28940 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
28950 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
28960 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
28970 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
28980 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
28990 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
289a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
289b0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
289c0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
289d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
289e0 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
289f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28a00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
28a10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
28a20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
28a30 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
28a60 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
28a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28a80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
28a90 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
28aa0 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
28ab0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
28ac0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
28ad0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
28ae0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
28af0 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
28b00 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
28b10 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
28b20 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
28b30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
28b40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
28b50 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
28b60 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
28b70 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
28b80 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
28b90 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
28ba0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
28bb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
28bc0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
28bd0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
28be0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28bf0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
28c00 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
28c20 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
28c30 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
28c40 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
28c50 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
28c80 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
28c90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
28ca0 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
28cb0 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
28cc0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
28cd0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
28ce0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
28cf0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
28d00 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
28d10 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
28d20 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
28d30 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
28d40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28d50 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28d60 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
28d70 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
28d80 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
28d90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
28da0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
28db0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
28dc0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
28dd0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
28de0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
28df0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
28e00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28e10 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
28e20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
28e30 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
28e40 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
28e50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
28e60 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
28e70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
28e80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
28e90 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
28ea0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28eb0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
28ec0 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
28ed0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
28ee0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
28ef0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
28f00 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
28f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28f20 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
28f30 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
28f40 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
28f50 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
28f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
28f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
28f80 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
28f90 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
28fa0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
28fb0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
28fc0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
28fd0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
28fe0 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
28ff0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
29000 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
29010 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
29020 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
29030 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
29040 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
29050 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
29060 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
29070 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
29080 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
29090 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
290a0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
290b0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
290c0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
290d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
290e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
290f0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
29100 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
29110 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
29120 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
29130 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
29140 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
29150 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
29160 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
29170 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
29180 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
29190 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
291a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
291b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
291c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
291d0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
291e0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
291f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
29200 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29210 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
29220 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
29230 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
29240 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
29250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29260 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
29270 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
29280 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
29290 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
292a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
292b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
292c0 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72  P_AggStep0, 0, r
292d0 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c  egAgg, pF->iMem,
292e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
292f0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
29300 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
29310 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
29320 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
29330 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
29340 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29350 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
29360 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
29370 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
29380 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
29390 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
293a0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
293b0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
293c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
293d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
293e0 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
293f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
29400 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
29410 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
29420 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
29430 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
29440 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
29450 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
29460 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
29470 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
29480 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
29490 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
294a0 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
294b0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
294c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
294d0 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
294e0 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
294f0 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
29500 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
29510 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
29520 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
29530 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
29540 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
29550 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
29560 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
29570 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
29580 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
29590 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
295a0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
295b0 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
295c0 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
295d0 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
295e0 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
295f0 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
29600 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
29610 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
29620 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
29630 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
29640 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
29650 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
29660 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
29670 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
29680 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
29690 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
296a0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
296b0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
296c0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
296d0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
296e0 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
296f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
29700 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
29710 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
29720 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
29730 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
29740 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
29750 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
29760 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29  f( addrHitTest )
29770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
29780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
29790 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d  rHitTest);.  }.}
297a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
297b0 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  ngle OP_Explain 
297c0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
297d0 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61  he VDBE to expla
297e0 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63  in a simple.** c
297f0 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22  ount(*) query ("
29800 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
29810 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a  FROM pTab")..*/.
29820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29830 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74  MIT_EXPLAIN.stat
29840 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53  ic void explainS
29850 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61  impleCount(.  Pa
29860 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29880 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
29890 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
298c0 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
298d0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
29900 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20   optimize scan, 
29910 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
29920 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
29930 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  ain==2 ){.    in
29940 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78  t bCover = (pIdx
29950 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  !=0 && (HasRowid
29960 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
29970 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
29980 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)));.    char *
29990 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50  zEqp = sqlite3MP
299a0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
299b0 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
299c0 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
299d0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
299e0 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55      bCover ? " U
299f0 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
29a00 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
29a10 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64      bCover ? pId
29a20 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
29a30 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
29a40 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
29a50 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
29a60 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
29a70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
29a80 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
29a90 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
29aa0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
29ab0 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
29ac0 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
29ad0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
29ae0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
29af0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29b00 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
29b10 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
29b20 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
29b30 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
29b40 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
29b50 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
29b60 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
29b70 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
29b80 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
29b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
29ba0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29bb0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
29bc0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
29bd0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
29be0 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
29bf0 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
29c00 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
29c10 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
29c20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
29c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29c40 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
29c50 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
29c60 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
29c70 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
29c80 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
29c90 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
29ca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
29cb0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
29cc0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
29cd0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
29ce0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
29cf0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
29d00 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
29d10 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
29d20 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
29d30 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
29d40 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
29d50 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
29d60 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
29d70 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
29d80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
29d90 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
29da0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
29db0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
29dc0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
29dd0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
29de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29df0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
29e00 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
29e10 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
29e20 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
29e30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
29e40 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
29e50 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
29e60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
29e70 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69  List = 0;  /* Li
29e80 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
29e90 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
29ea0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29eb0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
29ec0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
29ed0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
29ee0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
29ef0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
29f00 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
29f10 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
29f20 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
29f30 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
29f40 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
29f50 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
29f60 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
29f70 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
29f80 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
29f90 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
29fa0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
29fb0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
29fc0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
29fd0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
29fe0 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
29ff0 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
2a000 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
2a010 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
2a020 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
2a030 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
2a040 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2a050 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2a060 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
2a070 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
2a080 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
2a090 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
2a0a0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
2a0b0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
2a0c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
2a0d0 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
2a0e0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
2a0f0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2a100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2a110 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2a120 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2a130 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2a140 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
2a150 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2a160 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
2a170 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2a180 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
2a190 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
2a1a0 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
2a1b0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
2a1c0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2a1d0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
2a1e0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
2a1f0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2a200 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2a210 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2a220 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
2a230 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2a240 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
2a250 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
2a260 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
2a270 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2a280 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2a290 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c  tIndent++;.  SEL
2a2a0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2a2b0 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2a2c0 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2a2d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2a2e0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2a2f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2a300 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2a310 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2a320 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
2a330 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2a340 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2a350 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2a360 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2a370 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2a380 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2a390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2a3a0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2a3b0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2a3c0 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2a3d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2a3e0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2a3f0 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2a400 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2a410 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2a420 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2a430 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2a440 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2a450 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2a460 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2a470 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2a480 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2a490 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2a4a0 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2a4b0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2a4c0 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2a4d0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2a4e0 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2a4f0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2a500 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2a510 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2a520 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2a530 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2a540 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2a550 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2a560 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2a570 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2a580 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2a590 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2a5a0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2a5b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2a5c0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2a5d0 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2a5e0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2a5f0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2a600 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2a610 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2a620 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2a630 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2a640 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2a650 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2a660 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2a670 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2a680 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2a690 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2a6a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2a6b0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2a6c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2a6d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2a6e0 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2a6f0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2a700 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2a710 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2a720 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2a730 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2a740 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2a750 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2a760 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2a770 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2a780 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2a790 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2a7a0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2a7b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  );.  }.#endif...
2a7c0 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
2a7d0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
2a7e0 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
2a7f0 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
2a800 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
2a810 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
2a820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a830 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
2a840 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
2a850 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
2a860 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e  arse, pDest, p->
2a870 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
2a880 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
2a890 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
2a8a0 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  f..  /* Try to f
2a8b0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
2a8c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2a8d0 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65  ause up into the
2a8e0 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f   main query.  */
2a8f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2a900 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2a910 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2a920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2a930 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
2a940 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
2a950 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2a960 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2a970 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2a980 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2a990 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  [i];.    Select 
2a9a0 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
2a9b0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
2a9c0 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61  isAggSub;.    Ta
2a9d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
2a9e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
2a9f0 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2aa00 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74  nue;..    /* Cat
2aa10 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74  ch mismatch in t
2aa20 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  he declared colu
2aa30 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e  mns of a view an
2aa40 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
2aa50 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69      ** columns i
2aa60 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20  n the SELECT on 
2aa70 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69  the RHS */.    i
2aa80 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70  f( pTab->nCol!=p
2aa90 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2aaa0 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
2aab0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2aac0 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64  se, "expected %d
2aad0 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73   columns for '%s
2aae0 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20  ' but got %d",. 
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab00 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c       pTab->nCol,
2ab10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53   pTab->zName, pS
2ab20 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
2ab30 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  r);.      goto s
2ab40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
2ab50 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
2ab60 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2ab70 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2ab80 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
2ab90 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2aba0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2abb0 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
2abc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
2abd0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
2abe0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
2abf0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2ac00 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
2ac10 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
2ac20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
2ac30 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2ac40 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
2ac50 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2ac60 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2ac70 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2ac80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ac90 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2aca0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2acb0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2acc0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2acd0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2ace0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2acf0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2ad00 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ..  /* Get a poi
2ad10 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e  nter the VDBE un
2ad20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2ad30 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  , allocating a n
2ad40 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20  ew VDBE if one. 
2ad50 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   ** does not alr
2ad60 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  eady exist */.  
2ad70 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2ad80 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
2ad90 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
2ada0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64  lect_end;..#ifnd
2adb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2adc0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
2add0 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
2ade0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
2adf0 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
2ae00 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
2ae10 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
2ae20 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
2ae30 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2ae40 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2ae50 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2ae60 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2ae70 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2ae80 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2ae90 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2aea0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2aeb0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2aec0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2aed0 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2aee0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2aef0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2af00 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2af10 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2af20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2af30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2af40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2af50 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
2af60 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2af70 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
2af80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2af90 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2afa0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2afb0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2afc0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
2afd0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2afe0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2aff0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2b000 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2b010 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
2b020 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
2b030 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2b040 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2b050 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2b060 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
2b070 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
2b080 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
2b090 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2b0a0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
2b0b0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
2b0c0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
2b0d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2b0e0 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
2b0f0 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
2b100 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
2b110 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
2b120 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
2b130 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
2b140 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
2b150 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
2b160 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
2b170 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
2b180 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
2b190 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
2b1a0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
2b1b0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
2b1c0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
2b1d0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
2b1e0 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
2b1f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2b200 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
2b210 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2b220 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  fg.viaCoroutine=
2b230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2b240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b250 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2b260 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2b270 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2b280 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2b290 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2b2a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2b2b0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2b2c0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2b2d0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2b2e0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2b2f0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2b300 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2b310 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2b320 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2b330 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2b340 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2b350 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2b360 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2b370 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2b380 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2b390 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2b3a0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2b3b0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2b3c0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2b3d0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2b3e0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2b3f0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2b400 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2b410 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2b420 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2b430 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2b440 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2b450 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2b460 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2b470 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2b480 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2b490 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2b4a0 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2b4b0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2b4c0 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2b4d0 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2b4e0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2b4f0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2b500 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2b510 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2b520 6d 73 28 64 62 2c 20 70 53 75 62 2c 20 70 2d 3e  ms(db, pSub, p->
2b530 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69  pWhere, pItem->i
2b540 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23  Cursor).    ){.#
2b550 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2b560 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
2b570 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2b580 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
2b590 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
2b5a0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2b5b0 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d  p,("After WHERE-
2b5c0 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
2b5d0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  :\n"));.        
2b5e0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2b5f0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2b600 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2b610 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
2b620 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
2b630 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
2b640 75 65 72 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uery.    */.    
2b650 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
2b660 72 63 3d 3d 31 0a 20 20 20 20 20 26 26 20 28 70  rc==1.     && (p
2b670 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2b680 41 6c 6c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  All)==0.     && 
2b690 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2b6a0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2b6b0 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20  ubqCoroutine).  
2b6c0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2b6d0 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2b6e0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2b6f0 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2b700 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2b710 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2b720 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2b730 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b740 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2b750 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2b760 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2b770 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2b780 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2b790 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2b7a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b7b0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
2b7c0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2b7d0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
2b7e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2b7f0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
2b800 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2b810 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2b820 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
2b830 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
2b840 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2b850 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
2b860 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2b870 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2b880 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2b890 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2b8a0 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2b8b0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2b8c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2b8d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2b8e0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2b8f0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2b900 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2b910 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2b920 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2b930 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61     pItem->fg.via
2b940 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20  Coroutine = 1;. 
2b950 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b960 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64  esult = dest.iSd
2b970 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
2b980 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b990 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
2b9a0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2b9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b9c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2b9d0 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20  addrTop-1);.    
2b9e0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
2b9f0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
2ba00 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
2ba10 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2ba20 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2ba30 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20  at will fill an 
2ba40 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2ba50 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  with.      ** th
2ba60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
2ba70 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74  s subquery.  pIt
2ba80 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2ba90 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20  will point.     
2baa0 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65   ** to the addre
2bab0 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  ss of the genera
2bac0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  ted subroutine. 
2bad0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2bae0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20  n.      ** is a 
2baf0 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74  register allocat
2bb00 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73  ed to hold the s
2bb10 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
2bb20 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a   address.      *
2bb30 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41  /.      int topA
2bb40 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  ddr;.      int o
2bb50 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  nceAddr = 0;.   
2bb60 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a     int retAddr;.
2bb70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2bb80 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2bb90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
2bba0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2bbb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2bbc0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
2bbd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bbe0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2bbf0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
2bc00 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
2bc10 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2bc20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
2bc30 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2bc40 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
2bc50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2bc60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2bc70 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2bc80 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2bc90 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2bca0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2bcb0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2bcc0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2bcd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2bce0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2bcf0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2bd00 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2bd10 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
2bd20 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
2bd30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2bd40 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2bd50 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2bd60 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2bd70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2bd80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bd90 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2bda0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2bdb0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2bdc0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2bdd0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2bde0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2bdf0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2be00 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2be10 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2be20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2be30 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2be40 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2be50 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2be60 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2be70 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2be80 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2be90 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2bea0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2beb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2bec0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2bed0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2bee0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2bef0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2bf00 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2bf10 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2bf20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2bf30 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2bf40 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2bf50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2bf60 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2bf70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2bf80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bf90 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2bfa0 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2bfb0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2bfc0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2bfd0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2bfe0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2bff0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2c000 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
2c010 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
2c020 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2c030 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a  rHeight(p);.  }.
2c040 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72  #endif..  /* Var
2c050 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66  ious elements of
2c060 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69   the SELECT copi
2c070 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  ed into local va
2c080 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a  riables for.  **
2c090 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a   convenience */.
2c0a0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2c0b0 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d  List;.  pWhere =
2c0c0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
2c0d0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2c0e0 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
2c0f0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
2c100 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2c110 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2c120 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
2c130 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  0;..#if SELECTTR
2c140 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2c150 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2c160 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2c170 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2c180 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
2c190 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d  "After all FROM-
2c1a0 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a  clause analysis:
2c1b0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2c1c0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2c1d0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2c1e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2c1f0 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2c200 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2c210 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2c220 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2c230 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2c240 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2c250 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2c260 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2c270 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2c280 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2c290 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2c2a0 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2c2b0 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2c2c0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2c2d0 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2c2e0 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
2c2f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
2c300 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
2c310 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2c320 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2c330 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
2c340 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2c350 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
2c360 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
2c370 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
2c380 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
2c390 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
2c3a0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
2c3b0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
2c3c0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
2c3d0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
2c3e0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
2c3f0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
2c400 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
2c410 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
2c420 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
2c430 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
2c440 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
2c450 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
2c460 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
2c470 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
2c480 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2c490 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2c4a0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
2c4b0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
2c4c0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
2c4d0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
2c4e0 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
2c4f0 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
2c500 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2c510 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2c520 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2c530 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2c540 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2c550 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
2c560 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
2c570 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
2c580 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
2c590 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
2c5a0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
2c5b0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
2c5c0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
2c5d0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
2c5e0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
2c5f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
2c600 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
2c610 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
2c620 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
2c630 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
2c640 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
2c650 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
2c660 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c670 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2c680 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2c690 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65  create an epheme
2c6a0 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a  ral index to.  *
2c6b0 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  * do the sorting
2c6c0 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74  .  But this sort
2c6d0 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ing ephemeral in
2c6e0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2c6f0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73  .  ** being unus
2c700 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2c710 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
2c720 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
2c730 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61  der..  ** If tha
2c740 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2c750 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  hen the OP_OpenE
2c760 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
2c770 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  tion will be.  *
2c780 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  * changed to an 
2c790 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20  OP_Noop once we 
2c7a0 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
2c7b0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2c7c0 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65  x is.  ** not ne
2c7d0 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74  eded.  The sSort
2c7e0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76  .addrSortIndex v
2c7f0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2c800 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20  to facilitate.  
2c810 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  ** that change..
2c820 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2c830 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2c840 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2c850 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
2c860 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c870 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73  prList(pParse, s
2c880 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30  Sort.pOrderBy, 0
2c890 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
2c8a0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
2c8b0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
2c8c0 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
2c8d0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2c8e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c8f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2c900 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2c910 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45          sSort.iE
2c920 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f  Cursor, sSort.pO
2c930 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b  rderBy->nExpr+1+
2c940 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
2c950 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61  ,.          (cha
2c960 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2c970 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b  KEYINFO.      );
2c980 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53  .  }else{.    sS
2c990 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2c9a0 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
2c9b0 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
2c9c0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
2c9d0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2c9e0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
2c9f0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
2ca00 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2ca10 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
2ca20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ca30 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
2ca40 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
2ca50 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
2ca60 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
2ca70 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
2ca80 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
2ca90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2caa0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
2cab0 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47  SelectRow = LARG
2cac0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d  EST_INT64;.  com
2cad0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
2cae0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
2caf0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
2cb00 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
2cb10 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2cb20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2cb30 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
2cb40 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2cb50 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
2cb60 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
2cb70 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
2cb80 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
2cb90 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
2cba0 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
2cbb0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
2cbc0 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
2cbd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
2cbe0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2cbf0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
2cc00 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2cc10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2cc20 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
2cc30 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
2cc40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2cc50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2cc60 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc80 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2cc90 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
2ccc0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2ccd0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
2cce0 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
2cd10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2cd20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
2cd30 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
2cd40 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2cd50 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2cd60 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2cd70 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
2cd80 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2cd90 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
2cda0 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
2cdb0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
2cdc0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
2cdd0 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
2cde0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
2cdf0 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
2ce00 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
2ce10 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
2ce20 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
2ce30 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
2ce40 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20  INCT : 0);..    
2ce50 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
2ce60 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
2ce70 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2ce80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2ce90 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2cea0 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f  pWhere, sSort.pO
2ceb0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ced0 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74         p->pEList
2cee0 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29  , wctrlFlags, 0)
2cef0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
2cf00 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
2cf10 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
2cf20 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2cf30 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2cf40 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
2cf50 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
2cf60 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
2cf70 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
2cf80 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
2cf90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
2cfa0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2cfb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2cfc0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
2cfd0 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
2cfe0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
2cff0 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2d000 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
2d010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
2d020 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2d030 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
2d040 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
2d050 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2d060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
2d070 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
2d080 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2d090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
2d0a0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2d0c0 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
2d0d0 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
2d0e0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
2d0f0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
2d100 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
2d110 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
2d120 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
2d130 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
2d140 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2d150 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
2d160 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
2d170 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
2d180 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
2d190 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
2d1a0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
2d1b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2d1c0 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
2d1d0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
2d1e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2d1f0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
2d200 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
2d210 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2d220 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
2d230 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74  List, -1, &sSort
2d240 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
2d250 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
2d260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d270 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
2d280 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
2d2b0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
2d2c0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
2d2d0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
2d2e0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
2d2f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2d300 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
2d310 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
2d320 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
2d330 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
2d340 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
2d350 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
2d360 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
2d370 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
2d380 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
2d390 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
2d3a0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
2d3b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
2d3c0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
2d3d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2d3e0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2d3f0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
2d400 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2d410 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
2d420 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
2d430 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
2d440 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
2d450 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
2d460 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
2d470 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
2d480 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
2d490 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4b0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
2d4c0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
2d4d0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
2d4e0 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d500 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
2d510 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
2d520 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
2d530 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
2d540 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
2d550 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
2d560 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
2d570 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
2d580 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
2d590 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
2d5a0 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
2d5b0 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
2d5c0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
2d5d0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
2d5e0 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
2d5f0 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
2d600 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
2d610 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
2d620 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
2d630 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
2d640 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
2d650 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
2d660 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
2d670 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
2d680 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
2d690 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
2d6a0 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
2d6b0 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
2d6c0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
2d6d0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
2d6e0 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
2d6f0 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
2d700 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
2d710 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
2d720 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
2d730 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2d760 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
2d770 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2d780 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
2d790 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
2d7a0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
2d7b0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
2d7c0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
2d7d0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
2d7e0 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
2d7f0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2d800 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2d810 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2d820 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
2d830 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
2d840 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
2d850 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2d860 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d870 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2d880 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2d890 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
2d8a0 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d  lectRow>100 ) p-
2d8b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30  >nSelectRow = 10
2d8c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2d8d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
2d8e0 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  w = 1;.    }..  
2d8f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2d900 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
2d910 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
2d920 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
2d930 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
2d940 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
2d950 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
2d960 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
2d970 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
2d980 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
2d990 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
2d9a0 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
2d9b0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
2d9c0 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
2d9d0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
2d9e0 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
2d9f0 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
2da00 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a   BY might use a.
2da10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2da20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65  index that cause
2da30 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f  s rows to be gro
2da40 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73  uped together as
2da50 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
2da60 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
2da70 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72  y sorted. Either
2da80 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65   way, record the
2da90 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20   fact that the. 
2daa0 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61     ** ORDER BY a
2dab0 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
2dac0 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ses are the same
2dad0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2dae0 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a  orderByGrp.    *
2daf0 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
2db00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2db10 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2db20 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70  GroupBy, sSort.p
2db30 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
2db40 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79  ){.      orderBy
2db50 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Grp = 1;.    }. 
2db60 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2db70 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
2db80 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
2db90 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
2dba0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
2dbb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2dbc0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
2dbd0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
2dbe0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
2dbf0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
2dc00 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
2dc10 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
2dc20 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
2dc30 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
2dc40 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
2dc50 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
2dc60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2dc70 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
2dc80 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
2dc90 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
2dca0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2dcb0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
2dcc0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2dcd0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
2dce0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
2dcf0 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
2dd00 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2dd10 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
2dd20 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
2dd30 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
2dd40 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
2dd50 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
2dd60 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2dd70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2dd80 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2dd90 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
2dda0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2ddb0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2ddc0 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
2ddd0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
2dde0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
2ddf0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2de00 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
2de10 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
2de20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
2de30 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
2de40 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
2de50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2de60 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
2de70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2de80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2de90 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
2dea0 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
2deb0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2dec0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
2ded0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
2dee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2def0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2df00 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
2df10 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
2df20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
2df30 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
2df40 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
2df50 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
2df60 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
2df70 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
2df80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2df90 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2dfa0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
2dfb0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2dfc0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
2dfd0 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
2dfe0 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
2dff0 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
2e000 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
2e010 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
2e020 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
2e030 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2e040 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2e050 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
2e060 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2e070 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
2e080 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2e090 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
2e0a0 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
2e0b0 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
2e0c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e0d0 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
2e0e0 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
2e0f0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2e100 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
2e110 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
2e120 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
2e130 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2e140 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
2e150 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
2e160 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
2e170 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
2e180 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
2e190 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
2e1a0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
2e1b0 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
2e1c0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
2e1d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e1e0 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
2e1f0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2e200 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
2e210 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
2e220 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
2e230 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
2e240 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
2e250 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
2e260 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
2e270 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
2e280 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2e290 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
2e2a0 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
2e2b0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
2e2c0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
2e2d0 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
2e2e0 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
2e2f0 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
2e300 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
2e310 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
2e320 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
2e330 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
2e340 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
2e350 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
2e360 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
2e370 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
2e380 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
2e390 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
2e3a0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2e3b0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
2e3c0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
2e3d0 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
2e3e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2e3f0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2e400 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2e410 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2e420 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
2e430 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
2e440 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
2e450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2e460 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
2e470 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
2e480 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2e490 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
2e4a0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
2e4b0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
2e4c0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2e4d0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
2e4e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e4f0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
2e500 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
2e510 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
2e520 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
2e530 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
2e540 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e550 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
2e560 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2e570 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
2e580 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
2e590 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2e5a0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2e5b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2e5c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
2e5d0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
2e5e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2e5f0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
2e600 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2e610 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
2e620 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
2e630 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
2e640 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
2e650 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2e660 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
2e670 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2e680 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2e690 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e6a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e6b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e6c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
2e6d0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2e6e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2e6f0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
2e700 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2e710 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e720 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2e730 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
2e740 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2e750 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
2e760 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
2e770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e780 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2e790 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
2e7a0 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
2e7b0 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
2e7c0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
2e7d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
2e7e0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
2e7f0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2e800 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
2e810 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
2e820 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
2e830 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
2e840 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
2e850 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
2e860 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
2e870 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
2e880 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
2e890 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
2e8a0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
2e8b0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
2e8c0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
2e8d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e8e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e8f0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
2e900 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
2e910 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2e920 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2e930 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2e940 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
2e950 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
2e960 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
2e970 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
2e980 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
2e990 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
2e9a0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2e9b0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2e9c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
2e9d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
2e9e0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
2e9f0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
2ea00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2ea10 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
2ea20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
2ea30 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
2ea40 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
2ea50 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
2ea60 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
2ea70 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2ea80 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
2ea90 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
2eaa0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
2eab0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
2eac0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
2ead0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
2eae0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2eaf0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
2eb00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2eb10 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
2eb20 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
2eb30 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
2eb40 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
2eb50 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
2eb60 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
2eb70 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
2eb80 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
2eb90 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2eba0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
2ebb0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
2ebc0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
2ebd0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
2ebe0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
2ebf0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
2ec00 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
2ec10 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
2ec20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
2ec30 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
2ec40 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
2ec50 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
2ec60 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2ec70 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2ec80 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
2ec90 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
2eca0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
2ecb0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
2ecc0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
2ecd0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
2ece0 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
2ecf0 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
2ed00 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
2ed10 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2ed20 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
2ed30 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2ed40 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2ed50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2ed60 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2ed70 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2ed80 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
2ed90 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
2eda0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
2edc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2edd0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2ede0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2edf0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
2ee00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2ee10 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
2ee20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ee30 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2ee40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2ee50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2ee60 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2ee70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
2ee80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2ee90 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
2eea0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2eeb0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2eec0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2eed0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2eee0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
2eef0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2ef00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ef10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2ef20 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2ef30 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
2ef40 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
2ef50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ef60 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
2ef70 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2efa0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2efb0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2efc0 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
2efd0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2efe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eff0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
2f000 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
2f010 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2f020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f030 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f040 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
2f050 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
2f060 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2f070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f080 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
2f090 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
2f0a0 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
2f0b0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2f0c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2f0d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
2f0e0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2f0f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2f100 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2f110 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
2f120 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f130 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2f140 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2f150 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
2f160 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
2f170 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2f180 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
2f190 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2f1a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2f1b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f1c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
2f1d0 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
2f1e0 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
2f1f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f210 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
2f220 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2f230 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
2f240 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f250 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
2f260 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
2f270 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2f280 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
2f290 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
2f2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f2b0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2f2c0 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
2f2d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
2f2e0 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
2f2f0 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
2f300 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
2f310 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
2f320 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
2f330 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
2f340 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
2f350 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
2f360 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
2f370 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
2f380 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
2f390 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
2f3a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2f3b0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
2f3c0 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
2f3d0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
2f3e0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
2f3f0 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
2f400 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
2f410 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
2f420 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
2f430 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
2f440 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
2f450 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
2f460 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
2f470 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
2f480 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
2f490 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
2f4a0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2f4b0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2f4c0 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
2f4d0 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
2f4e0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
2f4f0 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
2f500 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
2f510 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2f520 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
2f530 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2f540 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
2f550 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
2f560 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
2f570 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
2f580 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2f590 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
2f5a0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
2f5b0 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
2f5c0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
2f5d0 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
2f5e0 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
2f5f0 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
2f600 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
2f610 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
2f620 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
2f630 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
2f640 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
2f650 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
2f660 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
2f670 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
2f680 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2f690 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
2f6a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f6b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f6c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2f6d0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2f6e0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2f6f0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2f700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f710 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
2f720 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
2f730 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
2f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f750 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74     sortOut, sort
2f760 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  PTab);.      }. 
2f770 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2f780 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2f790 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
2f7a0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2f7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2f7c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2f7d0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
2f7e0 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
2f7f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2f800 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
2f810 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
2f820 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
2f830 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2f840 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
2f850 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
2f860 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
2f870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2f880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2f890 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
2f8a0 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
2f8b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2f8e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
2f8f0 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
2f900 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2f910 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
2f920 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2f930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f940 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2f950 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20  _Jump, addr1+1, 
2f960 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  0, addr1+1); Vdb
2f970 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
2f980 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2f990 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
2f9a0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
2f9b0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
2f9c0 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
2f9d0 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
2f9e0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
2f9f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
2fa00 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
2fa10 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2fa20 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
2fa30 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
2fa40 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2fa50 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
2fa60 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
2fa70 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
2fa80 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
2fa90 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
2faa0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
2fab0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
2fac0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
2fad0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
2fae0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
2faf0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2fb00 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
2fb10 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
2fb20 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
2fb30 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
2fb40 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2fb50 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
2fb60 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
2fb70 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2fb80 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
2fb90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fba0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2fbb0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2fbc0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2fbd0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2fbe0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
2fbf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fc00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fc10 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
2fc20 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
2fc30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2fc40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fc50 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
2fc60 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2fc70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fc80 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2fc90 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2fca0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
2fcb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
2fcc0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
2fcd0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
2fce0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
2fcf0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
2fd00 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
2fd10 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
2fd20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
2fd30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2fd40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2fd50 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
2fd60 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2fd70 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2fd80 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2fd90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fda0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2fdb0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
2fdc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2fdd0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
2fde0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
2fdf0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2fe00 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2fe10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fe20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2fe30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fe40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fe50 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
2fe60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2fe70 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
2fe80 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2fe90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2fea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2feb0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2fec0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2fed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2fee0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
2fef0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
2ff00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2ff10 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
2ff20 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
2ff30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2ff40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ff50 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2ff60 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2ff70 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2ff80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ff90 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
2ffa0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
2ffb0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
2ffc0 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
2ffd0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2ffe0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
2fff0 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
30000 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
30010 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
30020 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
30030 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
30040 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
30050 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
30060 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
30070 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
30080 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
30090 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
300a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
300b0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
300c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
300d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
300e0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
300f0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
30100 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
30110 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
30120 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
30130 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
30140 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
30150 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
30160 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
30170 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
30180 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
30190 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
301a0 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
301b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
301c0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
301d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
301e0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
301f0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
30200 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
30210 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
30220 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
30230 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
30240 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
30250 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
30260 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
30270 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
30280 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
30290 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
302a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
302b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
302c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
302d0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
302e0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
302f0 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
30300 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
30310 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
30320 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
30330 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
30340 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
30350 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30360 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30370 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
30380 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
30390 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
303a0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
303b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
303c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
303d0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
303e0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
303f0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
30400 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
30410 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
30420 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
30430 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  t, -1, &sSort,. 
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30450 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
30460 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
30480 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
30490 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
304a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
304b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
304c0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
304d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
304e0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
304f0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
30500 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
30510 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
30520 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
30530 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
30540 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
30550 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
30560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
30570 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
30580 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
30590 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
305a0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
305b0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
305c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
305d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
305e0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
305f0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
30600 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
30610 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
30620 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
30630 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
30640 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
30650 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
30660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
30670 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
30680 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
30690 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
306a0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
306b0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
306c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
306d0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
306e0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
306f0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
30700 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
30710 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
30720 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
30730 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
30740 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
30750 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30760 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
30770 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30780 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
30790 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
307a0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
307b0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
307c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
307d0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
307e0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
307f0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
30800 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
30810 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
30820 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
30830 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
30840 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
30850 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
30860 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
30870 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
30880 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
30890 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
308a0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
308b0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
308c0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
308d0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
308e0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
308f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
30900 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
30910 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
30920 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
30930 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
30940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30950 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
30960 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
30970 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
30980 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
30990 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
309a0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
309b0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
309c0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
309d0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
309e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
309f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a00 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
30a10 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
30a20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
30a30 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
30a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
30a50 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
30a60 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
30a70 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
30a80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30a90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
30aa0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
30ab0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
30ac0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
30ad0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
30ae0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
30af0 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
30b00 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
30b10 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
30b20 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
30b30 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
30b40 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
30b50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
30b60 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
30b70 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
30b80 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
30b90 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
30ba0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
30bb0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
30bc0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
30bd0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
30be0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
30bf0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
30c00 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
30c10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
30c20 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
30c30 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
30c40 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
30c50 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
30c60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
30c70 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
30c80 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
30c90 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
30ca0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
30cb0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
30cc0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
30cd0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
30ce0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30cf0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
30d00 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
30d10 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
30d20 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
30d30 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
30d40 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
30d50 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
30d60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
30d70 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
30d80 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
30d90 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
30da0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
30db0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
30dc0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
30dd0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
30de0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
30df0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
30e00 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
30e10 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
30e20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
30e30 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
30e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30e50 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
30e60 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
30e70 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
30e80 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
30e90 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
30ea0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
30eb0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
30ec0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
30ed0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
30ee0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
30ef0 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
30f00 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
30f10 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
30f20 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
30f30 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
30f40 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
30f50 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
30f60 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
30f70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30f80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
30f90 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
30fa0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
30fb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
30fe0 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
30ff0 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
31000 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31010 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
31020 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
31030 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
31040 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
31050 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
31060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
31070 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31080 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
31090 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
310a0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
310b0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
310c0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
310d0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
310e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
310f0 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
31100 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
31110 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
31120 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
31130 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31140 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
31150 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
31160 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
31170 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
31180 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
31190 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
311a0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
311b0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
311c0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
311d0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
311e0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
311f0 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
31200 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
31210 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
31220 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
31230 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
31240 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
31250 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
31260 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
31270 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
31280 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
31290 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
312a0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
312b0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
312c0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
312d0 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
312e0 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
312f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
31300 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
31310 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
31320 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31330 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
31340 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
31350 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
31360 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
31370 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
31380 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
31390 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
313a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
313b0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
313c0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
313d0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
313e0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
313f0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
31400 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
31410 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
31420 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
31430 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
31440 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
31450 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
31460 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
31470 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
31480 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
31490 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
314a0 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
314b0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
314c0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
314d0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
314e0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
314f0 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
31500 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
31510 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
31520 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
31530 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
31540 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
31550 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
31560 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
31570 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
31580 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
31590 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
315a0 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
315b0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
315c0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
315d0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
315e0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
315f0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
31600 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31610 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
31620 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
31630 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
31640 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
31650 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
31660 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
31670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31680 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
31690 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
316a0 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
316b0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
316c0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
316d0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
316e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
316f0 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
31700 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31710 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
31720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
31730 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
31740 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
31750 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
31760 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
31770 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
31780 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
31790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
317a0 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
317b0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
317c0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
317d0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
317e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
317f0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
31800 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
31810 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
31820 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
31830 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
31840 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
31850 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
31860 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
31870 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
31880 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31890 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
318a0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
318b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
318c0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
318d0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
318e0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
318f0 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c  here, pMinMax,0,
31900 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
31910 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
31920 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31930 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
31940 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
31950 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
31960 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
31970 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
31980 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
31990 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
319a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
319b0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
319c0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
319d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
319e0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
319f0 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29  ered(pWInfo)>0 )
31a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31a10 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73  te3VdbeGoto(v, s
31a20 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
31a30 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
31a40 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
31a50 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
31a60 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
31a70 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
31a80 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
31a90 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
31aa0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
31ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
31ac0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
31ad0 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
31ae0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
31af0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31b00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
31b10 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
31b20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
31b30 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
31b40 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
31b50 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
31b60 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
31b70 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
31b80 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
31b90 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
31ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31bb0 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
31bc0 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
31bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31be0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
31bf0 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
31c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
31c10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
31c20 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
31c30 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
31c40 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
31c50 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
31c60 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
31c70 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
31c80 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
31c90 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
31ca0 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
31cb0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
31cc0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
31cd0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
31ce0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
31cf0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
31d00 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
31d10 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
31d20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
31d30 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
31d40 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
31d50 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
31d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31d70 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42         sSort.nOB
31d80 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
31d90 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
31da0 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
31db0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
31dc0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
31dd0 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
31de0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
31df0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
31e00 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
31e10 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
31e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
31e30 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
31e40 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
31e50 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
31e60 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
31e70 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
31e80 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
31e90 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
31ea0 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77  ode to 1. Otherw
31eb0 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d  ise 0. */.  rc =
31ec0 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30   (pParse->nErr>0
31ed0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  );..  /* Control
31ee0 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
31ef0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
31f00 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
31f10 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
31f20 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
31f30 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
31f40 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
31f50 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
31f60 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
31f70 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
31f80 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
31f90 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
31fa0 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
31fb0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
31fc0 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
31fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
31fe0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
31ff0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
32000 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
32010 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
32020 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
32030 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
32040 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
32050 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
32060 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
32070 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
32080 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45  o.aFunc);.#if SE
32090 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
320a0 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
320b0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
320c0 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
320d0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  ;.  pParse->nSel
320e0 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
320f0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
32100 0a 7d 0a                                         .}.