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

Artifact 45a814a755f90c1a6345164d2da4a8ef293da53d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74  ral */.  u8 sort
07c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f  Flags;         /
07d0: 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53  * Zero or more S
07e0: 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a  ORTFLAG_* bits *
07f0: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52  /.};.#define SOR
0800: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
0810: 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53   0x01   /* Use S
0820: 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61  orterOpen instea
0830: 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72  d of OpenEphemer
0840: 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  al */../*.** Del
0850: 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74  ete all the cont
0860: 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20  ent of a Select 
0870: 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61 6c  structure.  Deal
0880: 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75 63  locate the struc
0890: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 6f  ture.** itself o
08a0: 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73 20  nly if bFree is 
08b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
08c0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
08d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
08e0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46 72  lect *p, int bFr
08f0: 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  ee){.  while( p 
0900: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
0910: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
0920: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
0930: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0940: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
0950: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72  elete(db, p->pSr
0970: 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  c);.    sqlite3E
0980: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0990: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
09a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
09b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ete(db, p->pGrou
09c0: 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
09d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
09e0: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
09f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0a00: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
0a10: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
0a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0a30: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
0a40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a50: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
0a60: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
0a70: 33 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20  3WithDelete(db, 
0a80: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69  p->pWith);.    i
0a90: 66 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74  f( bFree ) sqlit
0aa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0ab0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ac0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ad0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0ae0: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0af0: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0b00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0b10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0b20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0b30: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0b40: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0b50: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0b60: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0b70: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0b80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
0b90: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
0ba0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0bb0: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0bc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0bd0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0be0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0c00: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0c10: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0c20: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0c30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0c40: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0c60: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0c70: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0c80: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0c90: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0ca0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0cb0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0cc0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0cd0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0ce0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0cf0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0d00: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0d10: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0d20: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0d30: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0d40: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0d50: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0d60: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0d90: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0db0: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0dc0: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0dd0: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0de0: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0df0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0e00: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0e10: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0e20: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0e30: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0e40: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0e50: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0e60: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0e70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0e80: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0e90: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0ea0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0ec0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0ed0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0ee0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
0f00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f10: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  );.    pNew = &s
0f20: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
0f30: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
0f40: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
0f50: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
0f60: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0f70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0f80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0f90: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0fa0: 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a  TK_ALL,0));.  }.
0fb0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
0fc0: 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70   pEList;.  if( p
0fd0: 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20  Src==0 ) pSrc = 
0fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0ff0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
1000: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
1010: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
1020: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1030: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1040: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1050: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1060: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1070: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1080: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1090: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
10a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
10b0: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
10c0: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
10d0: 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d   pLimit;.  pNew-
10e0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
10f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  et;.  assert( pO
1100: 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d  ffset==0 || pLim
1110: 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  it!=0 || pParse-
1120: 3e 6e 45 72 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d  >nErr>0 || db->m
1130: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
1140: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1150: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
1160: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1170: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
1180: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1190: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65  iled ) {.    cle
11a0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
11b0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
11c0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
11d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11e0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
11f0: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1200: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1210: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1220: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1230: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1240: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1250: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
1260: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
1270: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
1280: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
1290: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
12a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
12c0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
12d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
12e0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
12f0: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1300: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1310: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1320: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1330: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1340: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1350: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1360: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1370: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
1390: 65 63 74 20 2a 70 29 7b 0a 20 20 63 6c 65 61 72  ect *p){.  clear
13a0: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
13b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13d0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
13e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
13f0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
1400: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
1410: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
1420: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
1430: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1440: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1450: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1460: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1470: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1480: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1490: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
14a0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
14b0: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
14c0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
14d0: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
14e0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
14f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
1500: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
1510: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
1520: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
1530: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1540: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1550: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1560: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1570: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1580: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1590: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
15a0: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
15b0: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
15c0: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
15d0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
15e0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
15f0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1600: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1610: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1620: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1640: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1650: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1660: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1670: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1680: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1690: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
16a0: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
16b0: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1700: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1710: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1720: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1730: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1740: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1750: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1760: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1770: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1780: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1790: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
17a0: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
17b0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
17c0: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
17d0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
17e0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
17f0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1800: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1810: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1820: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1830: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1840: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1850: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1860: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1870: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1880: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1890: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
18a0: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
18b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
18c0: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
18d0: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
18e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
18f0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1900: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1910: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1920: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1930: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1940: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1960: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1970: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1980: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1990: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
19a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
19b0: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
19c0: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
19d0: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
19e0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
19f0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1a00: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1a10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a20: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1a30: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1a40: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1a50: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1a60: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1a70: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1a80: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1a90: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1aa0: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1ab0: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1ac0: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1ad0: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1ae0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1af0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1b00: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1b10: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1b20: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1b30: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
1b40: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
1b50: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
1b60: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1b70: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1b90: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1ba0: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1bb0: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1bc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1bd0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1be0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
1bf0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c00: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
1c10: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
1c20: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
1c30: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
1c40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c50: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1c60: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
1c70: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
1c80: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
1c90: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
1ca0: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
1cb0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1cc0: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
1cd0: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
1cf0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
1d00: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
1d10: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
1d20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d30: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
1d40: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
1d50: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
1d60: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
1d70: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
1d80: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1d90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
1da0: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
1db0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1dc0: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
1dd0: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
1de0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
1df0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
1e00: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
1e10: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1e20: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
1e30: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
1e40: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1e50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1e60: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
1e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1e90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
1ea0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
1eb0: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1ed0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
1ee0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
1ef0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
1f00: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
1f10: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
1f20: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
1f30: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
1f40: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
1f50: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
1f60: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
1f70: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
1f80: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
1f90: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
1fa0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
1fb0: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
1fc0: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
1fd0: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
1fe0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
1ff0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
2000: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
2010: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2020: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
2030: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2050: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2060: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2070: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2080: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
20a0: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
20b0: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
20c0: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
20d0: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
20e0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
20f0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
2100: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
2110: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
2120: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
2130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2140: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2160: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2170: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2180: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21a0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
21b0: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
21c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
21d0: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
21e0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
21f0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
2200: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
2210: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
2220: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
2230: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2240: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2250: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2260: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2270: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2280: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2290: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
22a0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
22c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
22d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22e0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
22f0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
2300: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
2310: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2320: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
2330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2340: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2350: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2360: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2370: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2380: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2390: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
23a0: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
23b0: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
23c0: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
23d0: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
23e0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
23f0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
2400: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
2410: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
2420: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
2430: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2440: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2450: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2470: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
24c0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
24d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
24e0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
24f0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2500: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2520: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
2530: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2540: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2550: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2560: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2580: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2590: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
25c0: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
25d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
25e0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
25f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2600: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2610: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2620: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2650: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2660: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2670: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2680: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
26b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
26c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
26d0: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
26e0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
26f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2700: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2710: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2720: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2730: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2740: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2750: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2760: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2770: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2780: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2790: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
27a0: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
27b0: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
27c0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27d0: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
27e0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
27f0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2800: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2810: 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69  E1, pE2, 0);.  i
2820: 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65  f( pEq && isOute
2830: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
2840: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71  rSetProperty(pEq
2850: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2860: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2870: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 71  rHasProperty(pEq
2880: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2890: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
28a0: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
28b0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52  erty(pEq, EP_NoR
28c0: 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d  educe);.    pEq-
28d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
28e0: 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61   = (i16)pE2->iTa
28f0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68  ble;.  }.  *ppWh
2900: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2910: 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72  rAnd(db, *ppWher
2920: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2930: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2940: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2950: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2960: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2970: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2980: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2990: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
29a0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
29b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
29c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
29d0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
29e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
29f0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2a00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2a10: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2a20: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2a30: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2a40: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2a50: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2a60: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2a70: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2a80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2a90: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2aa0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2ab0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2ac0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2ad0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2ae0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2af0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2b00: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2b10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2b20: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2b30: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2b40: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2b50: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2b60: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2b70: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
2b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
2b90: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
2ba0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2bb0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
2bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
2bd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
2be0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
2bf0: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
2c00: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
2c10: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
2c20: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
2c30: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
2c40: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
2c50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2c60: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
2c70: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
2c80: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
2c90: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2ca0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
2cb0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2cc0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
2cd0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
2ce0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
2cf0: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
2d00: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
2d10: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
2d20: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
2d30: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
2d40: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
2d50: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
2d60: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
2d70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
2d80: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
2d90: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
2da0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
2db0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
2dc0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
2dd0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
2de0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
2df0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
2e00: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
2e10: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
2e20: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
2e30: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2e60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2e70: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2e80: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2e90: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2ea0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
2eb0: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
2ec0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2ed0: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  6)iTable;.    se
2ee0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2ef0: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
2f00: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
2f10: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
2f20: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
2f30: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
2f40: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
2f50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2f60: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2f70: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2f80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2f90: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2fa0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2fb0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2fc0: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2fd0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2fe0: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2ff0: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
3000: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
3010: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
3020: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
3030: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
3040: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
3050: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
3060: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
3070: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
3080: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
3090: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
30a0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
30b0: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
30c0: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
30d0: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
30e0: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
30f0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
3100: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
3110: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
3120: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
3130: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
3140: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
3150: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
3160: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
3170: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
3180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
3190: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
31a0: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
31b0: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
31c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
31d0: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
31e0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
31f0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
3200: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
3210: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
3220: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
3230: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
3240: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
3250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3260: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
3270: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3280: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
3290: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
32a0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
32b0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
32c0: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
32d0: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
32e0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
32f0: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
3300: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
3310: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
3320: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
3330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
3340: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
3350: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
3360: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
3370: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
3380: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
3390: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
33a0: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
33b0: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
33c0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65     if( NEVER(pLe
33d0: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
33e0: 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74  htTab==0) ) cont
33f0: 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65  inue;.    isOute
3400: 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69  r = (pRight->joi
3410: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3420: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3430: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3440: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3450: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3460: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3470: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3480: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3490: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
34a0: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
34b0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69   if( pRight->joi
34c0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
34d0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
34e0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
34f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3510: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3520: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3530: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3540: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3550: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3560: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3580: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3590: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
35a0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
35b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
35c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
35d0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
35e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
35f0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3600: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3610: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3620: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3630: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3640: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3650: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3660: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3670: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3680: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3690: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
36a0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
36b0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
36c0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
36d0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
36e0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
36f0: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3700: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3730: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3750: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3760: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3770: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3780: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3790: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
37a0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
37b0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
37c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
37d0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
37e0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
37f0: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
3800: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
3810: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
3820: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
3840: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
3850: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
3860: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
3870: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
3880: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
3890: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
38a0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
38b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
38c0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
38d0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
38e0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
38f0: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
3900: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
3910: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
3920: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
3930: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
3940: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
3950: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
3960: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
3970: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3980: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
3990: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
39a0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
39b0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
39c0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
39d0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
39e0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
39f0: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
3a00: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
3a10: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
3a20: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
3a30: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
3a40: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
3a50: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
3a60: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
3a70: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
3a80: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
3a90: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
3aa0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
3ab0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
3ac0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
3ad0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
3ae0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3af0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3b00: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
3b10: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
3b20: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
3b30: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
3b40: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
3b50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3b60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b70: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
3b80: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
3b90: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
3ba0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
3bb0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
3bc0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3bd0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
3be0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
3bf0: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3c00: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
3c10: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
3c20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c30: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
3c40: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c50: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c60: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
3c70: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
3c80: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
3c90: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
3ca0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
3cb0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
3cc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
3cd0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
3ce0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
3cf0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3d00: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3d10: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3d20: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
3d30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3d50: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
3d60: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
3d70: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
3d80: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
3d90: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
3da0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
3db0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
3dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3dd0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3de0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3df0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3e00: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3e30: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3e40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
3e50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
3e60: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3e70: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
3e80: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
3e90: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
3ea0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3eb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3ec0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3ed0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
3ee0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
3ef0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
3f00: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
3f10: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
3f20: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
3f30: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
3f40: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
3f50: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
3f60: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
3f70: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
3f80: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b  to the end */.);
3f90: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3fa0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3fb0: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
3fc0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
3fd0: 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20  Data.** through 
3fe0: 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20  regData+nData-1 
3ff0: 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  onto the sorter.
4000: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4010: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
4020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4040: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4050: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
4060: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
4070: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
4080: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4090: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
40a0: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
40b0: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
40c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
40d0: 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20  nt regData,     
40e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
40f0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
4100: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
4110: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  d */.  int nData
4120: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4130: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4140: 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  nts in the data 
4150: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4160: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4170: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4180: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4190: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
41a0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
41b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
41c0: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
41e0: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
41f0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
4200: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
4210: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
4220: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
4230: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
4240: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
4250: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
4260: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4270: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
4280: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
4290: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
42a0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
42b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
42c0: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
42d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
42e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
4310: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
4320: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
4330: 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
4340: 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  >nMem;          
4350: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
4360: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
4370: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
4380: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
4390: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
43b0: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
43c0: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
43f0: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
4400: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
4410: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
4420: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
4430: 71 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  q==1 );.  if( nP
4440: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4450: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4460: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4470: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4480: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4490: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
44a0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
44b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
44c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
44d0: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
44e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
44f0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4500: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4510: 79 2c 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49  y, regBase, SQLI
4520: 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
4530: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
4540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4550: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
4560: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4570: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
4580: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
4590: 65 66 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20  efixReg==0 ){.  
45a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
45b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
45c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
45d0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
45e0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
45f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4600: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4610: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4620: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4630: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4640: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4650: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4660: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4670: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4680: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4690: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
46a0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
46b0: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
46c0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
46d0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
46e0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
46f0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4700: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4710: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4720: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4730: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4740: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4750: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4760: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4770: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4780: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4790: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
47a0: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
47b0: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
47c0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
47d0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
47e0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
47f0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4800: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4810: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4820: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4830: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4840: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4850: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4860: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4870: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4880: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4890: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
48a0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
48b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
48c0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
48d0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
48e0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
48f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4900: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4910: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4920: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4930: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4940: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4950: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4960: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4970: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4980: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4990: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
49a0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
49b0: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
49c0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
49d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
49e0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
49f0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4a00: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
4a10: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4a20: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4a30: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4a50: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4a60: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4a70: 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e   testcase( pKI->
4a80: 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20 20  nXField>2 );.   
4a90: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4aa0: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4ab0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4ac0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4ad0: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64      pKI->nXField
4b10: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70  -1);.    addrJmp
4b20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
4b30: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
4b40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4b50: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
4b60: 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64  addrJmp+1, 0, ad
4b70: 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f  drJmp+1); VdbeCo
4b80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70  verage(v);.    p
4b90: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
4ba0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4bb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4bc0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4bd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4be0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
4bf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
4c00: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
4c10: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
4c20: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
4c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c40: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
4c50: 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ter, pSort->iECu
4c60: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4c70: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4c80: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
4c90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4ca0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4cb0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
4cc0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4cf0: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
4d00: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
4d10: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4d20: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
4d30: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
4d40: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
4d50: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
4d60: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
4d70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4d80: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
4d90: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  sor, regRecord);
4da0: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
4db0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
4dc0: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
4dd0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4de0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4df0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4e00: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4e10: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
4e20: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4e30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4e40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
4e50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4e60: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
4e70: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 30 2c  Zero, iLimit, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4eb0: 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e  OP_Last, pSort->
4ec0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4ee0: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
4ef0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4f20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f30: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
4f40: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
4f50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4f60: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
4f70: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4f80: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4f90: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
4fa0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
4fb0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
4fc0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
4fd0: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
4fe0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
4ff0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5000: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
5010: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
5020: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
5030: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
5040: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
5050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5060: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66 66  , OP_IfNeg, iOff
5070: 73 65 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62  set, 0, -1); Vdb
5080: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
50a0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
50b0: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
50c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
50d0: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
50e0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
50f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5100: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
5110: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
5120: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
5130: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
5140: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
5150: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
5160: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
5170: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
5180: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
5190: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
51a0: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
51b0: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
51c0: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
51d0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
51e0: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
51f0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
5200: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
5210: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
5220: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
5230: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
5240: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
5250: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
5260: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
5270: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
5280: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
5290: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
52a0: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
52b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
52c0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
52d0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
52e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
52f0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
5300: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
5310: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
5320: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
5330: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
5340: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
5350: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
5360: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
5370: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
5380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
5390: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
53a0: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
53b0: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
53c0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
53d0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
53e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
53f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5400: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5410: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5420: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
5430: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
5440: 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b  epeat, iMem, N);
5450: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5460: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5470: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5480: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
5490: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
54a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
54b0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
54c0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
54d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
54e0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
54f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5500: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
5510: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
5520: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
5530: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
5540: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
5550: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
5560: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
5570: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
5580: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
5590: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
55a0: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
55b0: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
55c0: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
55d0: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
55e0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
55f0: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
5600: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
5610: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
5620: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
5630: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
5640: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
5650: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
5660: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
5670: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
5680: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
5690: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
56a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
56b0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
56c0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
56d0: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
56e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
56f0: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
5700: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
5710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5720: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5730: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
5740: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
5750: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5760: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
5770: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
5780: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
5790: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
57a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
57b0: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
57c0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
57d0: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
57e0: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
57f0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5800: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
5810: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
5820: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5830: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5850: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5860: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
5870: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
5880: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
5890: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
58a0: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
58b0: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ive, then the pE
58c0: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
58d0: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
58e0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
58f0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
5900: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
5910: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
5920: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
5930: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
5940: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
5950: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5960: 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65  .** to get numbe
5970: 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  r columns and th
5980: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65  e datatype for e
5990: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
59a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
59b0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
59c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
59d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
59e0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
59f0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
5a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5a10: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
5a20: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
5a30: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
5a40: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
5a50: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
5a60: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
5a70: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
5a80: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
5a90: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
5aa0: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
5ab0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
5ac0: 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt,         /* I
5ad0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
5ae0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
5af0: 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  ss ORDER BY */. 
5b00: 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44   DistinctCtx *pD
5b10: 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e  istinct, /* If n
5b20: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5b30: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5b40: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65  DISTINCT */.  Se
5b50: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
5b60: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
5b70: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
5b80: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5b90: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
5ba0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5bb0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
5bc0: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
5bd0: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
5be0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5bf0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
5c00: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
5c10: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  oop */.){.  Vdbe
5c20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5c30: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5c40: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
5c50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5c60: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
5c70: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
5c80: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
5c90: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
5ca0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
5cb0: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
5cc0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
5cd0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
5ce0: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
5cf0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
5d00: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5d10: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
5d20: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
5d40: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
5d50: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
5d60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
5d70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
5d80: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
5d90: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
5da0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
5db0: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
5dc0: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
5dd0: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
5de0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5df0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5e00: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5e10: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5e20: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5e30: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
5e40: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
5e50: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
5e60: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
5e70: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
5e80: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
5e90: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5ea0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
5eb0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
5ec0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5ed0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5ee0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
5ef0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
5f00: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
5f10: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
5f20: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
5f30: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
5f40: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
5f50: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
5f60: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
5f70: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
5f80: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
5f90: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
5fa0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
5fb0: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
5fc0: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
5fd0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
5fe0: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
5ff0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
6000: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6010: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
6020: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
6030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
6040: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
6050: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
6060: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
6070: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
6080: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
6090: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
60a0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
60b0: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
60c0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
60d0: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
60e0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
60f0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
6100: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
6110: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
6120: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
6130: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
6140: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
6150: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
6160: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
6170: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6180: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
6190: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
61a0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
61b0: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
61c0: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
61d0: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
61e0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
61f0: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
6200: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
6210: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65  sultCol;.  regRe
6220: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6230: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
6240: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
6250: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
6260: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6280: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
6290: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
62a0: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
62b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
62c0: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
62d0: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
62e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
62f0: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6300: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6310: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6320: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6330: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6340: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6350: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
6360: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
6370: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
6380: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
6390: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
63a0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
63b0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
63c0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
63d0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
63e0: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
63f0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6410: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6420: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
6430: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6440: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
6450: 72 65 67 52 65 73 75 6c 74 2c 20 65 63 65 6c 46  regResult, ecelF
6460: 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
6470: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
6480: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
6490: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
64a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
64b0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
64c0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
64d0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
64e0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
64f0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
6500: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
6510: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
6520: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
6530: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
6540: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
6550: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
6560: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
6570: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
6580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
6590: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
65a0: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
65b0: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
65c0: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
65d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
65e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
65f0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
6600: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
6610: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
6620: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
6630: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
6640: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
6650: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
6660: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
6670: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6680: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6690: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
66a0: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
66b0: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
66c0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
66d0: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
66e0: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
66f0: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
6700: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
6710: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
6720: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
6730: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
6740: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
6750: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
6760: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
6770: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
6780: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
6790: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
67a0: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
67b0: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
67c0: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
67d0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
67e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
67f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
6800: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
6810: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
6820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
6830: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
6840: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
6850: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
6860: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
6870: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
6880: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
6890: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
68a0: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
68b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
68c0: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
68d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
68e0: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
68f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
6900: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6910: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
6920: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6930: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6940: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
6950: 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d  f( i<nResultCol-
6960: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6980: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67  p3(v, OP_Ne, reg
6990: 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c  Result+i, iJump,
69a0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
69b0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
69c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
69d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
69e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
69f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
6a00: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
6a10: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
6a20: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
6a30: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6a40: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d  v);.           }
6a50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6a60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6a70: 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
6a80: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
6a90: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
6aa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6ab0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
6ac0: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
6ad0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6ae0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t( sqlite3VdbeCu
6af0: 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a  rrentAddr(v)==iJ
6b00: 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ump || pParse->d
6b10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6b20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6b30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6b40: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
6b50: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
6b60: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
6b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6b80: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
6b90: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6ba0: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
6bb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6bc0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
6bd0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
6be0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6bf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
6c00: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6c10: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
6c20: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
6c30: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
6c40: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
6c50: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
6c60: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
6c70: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
6c80: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
6c90: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
6ca0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
6cb0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
6cc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6cd0: 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d  }.    if( pSort=
6ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
6cf0: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
6d00: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6d20: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
6d30: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
6d40: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
6d50: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
6d60: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
6d70: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
6d80: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
6d90: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6da0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6db0: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
6dc0: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
6dd0: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
6de0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
6df0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6e10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6e20: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6e30: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
6e40: 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
6e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6e60: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6e70: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
6e80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6e90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ea0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
6eb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
6ec0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
6ed0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
6ee0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
6ef0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
6f00: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
6f10: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
6f20: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
6f30: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
6f40: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
6f50: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
6f60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6f70: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
6f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f90: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
6fa0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
6fb0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6fc0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
6fd0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
6fe0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
6ff0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
7000: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7010: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7020: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7030: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7040: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7050: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7060: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7070: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7080: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7090: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
70a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
70b0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
70c0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
70d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
70e0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
70f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7100: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7110: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7120: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7130: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7140: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7150: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
71a0: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
71b0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
71c0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
71d0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
71e0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
71f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7200: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7210: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7220: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7230: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7240: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7250: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7260: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7270: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7280: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7290: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
72a0: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
72b0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
72c0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
72d0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
72e0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
72f0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7300: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7310: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7320: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7330: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7340: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7350: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7360: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7370: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7380: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7390: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
73a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
73b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
73d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
73e0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
73f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7400: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7410: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7420: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7440: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7450: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
7460: 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c 20  +nPrefixReg, 1, 
7470: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7490: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
74a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
74b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
74c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
74d0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
74e0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
74f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7500: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7510: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7520: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7530: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7540: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7550: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7560: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7570: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7580: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7590: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
75a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
75b0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
75c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
75e0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
75f0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
7600: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
7610: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
7620: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
7630: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
7640: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
7650: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
7660: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
7670: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
7680: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
7690: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
76a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
76b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
76c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
76d0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
76e0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
76f0: 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20  st->affSdst =.  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
7720: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
7730: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
7740: 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
7750: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7760: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
7770: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
7780: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
7790: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
77a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
77b0: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
77c0: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
77d0: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
77e0: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
77f0: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
7800: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
7810: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
7820: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
7830: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
7840: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
7850: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
7860: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7870: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7880: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
7890: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
78a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
78b0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
78c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
78d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
78e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
78f0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
7900: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7910: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
7920: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
7930: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
7940: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
7950: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
7960: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
7970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7980: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
7990: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
79a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
79b0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
79c0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
79d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
79e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
79f0: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
7a00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7a10: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
7a20: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
7a30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7a40: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
7a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7a70: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
7a80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7a90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
7aa0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
7ab0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
7ac0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7ad0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7ae0: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
7af0: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
7b00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
7b10: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
7b20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
7b30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7b40: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
7b50: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
7b60: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
7b70: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
7b80: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
7b90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
7ba0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
7bb0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7bc0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7bd0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7be0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7bf0: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7c00: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7c10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7c20: 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72   regResult==iPar
7c30: 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  m );.        /* 
7c40: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
7c50: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
7c60: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
7c70: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
7c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c90: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
7ca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7cb0: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63  BQUERY */..    c
7cc0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
7cd0: 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64  e:       /* Send
7ce0: 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f   data to a co-ro
7cf0: 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73  utine */.    cas
7d00: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20  e SRT_Output: { 
7d10: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7d20: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
7d30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7d40: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7d50: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
7d60: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7d70: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
7d80: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7d90: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7da0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7db0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7dc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7dd0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
7df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7e00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7e20: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
7e30: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
7e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e60: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7e70: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
7e80: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7e90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7ea0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7eb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7ec0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7ed0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
7ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7f00: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
7f10: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
7f20: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
7f30: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
7f40: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
7f50: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
7f60: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
7f70: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
7f80: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
7f90: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
7fa0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
7fb0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
7fc0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
7fd0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
7fe0: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
7ff0: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
8000: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
8010: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
8020: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
8030: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
8040: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
8050: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
8060: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
8070: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
8080: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
8090: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
80a0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
80b0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
80c0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
80d0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
80e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
80f0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
8100: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
8110: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
8120: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
8130: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
8140: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
8150: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
8160: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8170: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8180: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
8190: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
81a0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
81b0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
81c0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
81d0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
81e0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
81f0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8200: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
8210: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
8220: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
8230: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
8240: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
8250: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
8260: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
8270: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
8280: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
8290: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
82a0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
82b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
82c0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
82d0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
82e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
8310: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8320: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8330: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8340: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8350: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8360: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
8370: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8380: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
8390: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
83a0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
83b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
83d0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
83e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
83f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8400: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
8410: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
8420: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8430: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8450: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8460: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
8490: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
84a0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
84d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
84e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
84f0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
8500: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
8510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8520: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8530: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8540: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8560: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8570: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
8580: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
8590: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
85a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
85b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
85c0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
85d0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
85e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
85f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8600: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
8610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8620: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8630: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8640: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8650: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8660: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
8670: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
8680: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
8690: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
86a0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
86b0: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
86c0: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
86d0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
86e0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
86f0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
8700: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
8710: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
8720: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8730: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8740: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8750: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
8760: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
8770: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8780: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
8790: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
87a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
87b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
87c0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
87d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
87e0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
87f0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8800: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8810: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8820: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8830: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8840: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8850: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
8860: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
8870: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
8880: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
8890: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
88a0: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
88b0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
88c0: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
88d0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
88e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
88f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
8900: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
8910: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
8920: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8930: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8940: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8950: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8960: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8970: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
8980: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
8990: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
89a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89b0: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
89c0: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
89d0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
89e0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
89f0: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
8a00: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
8a10: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
8a20: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
8a30: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
8a40: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
8a50: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
8a60: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
8a70: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
8a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8a90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8ac0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
8ad0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
8ae0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
8af0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8b00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8b10: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8b20: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
8b30: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
8b40: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
8b50: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
8b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
8b70: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
8b80: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8b90: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8ba0: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
8bb0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8bc0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8bd0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8be0: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
8bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8c00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8c10: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
8c20: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
8c30: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
8c40: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
8c50: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
8c60: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
8c70: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
8c80: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
8c90: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
8ca0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
8cb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8cc0: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
8cd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
8ce0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
8cf0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
8d00: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
8d10: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
8d20: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
8d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8d40: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
8d50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
8d60: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
8d70: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8d80: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
8d90: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
8da0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
8db0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
8dc0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
8dd0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
8de0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
8df0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8e00: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
8e10: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
8e20: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
8e30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8e40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8e50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
8e60: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
8e70: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
8e80: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
8e90: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
8ea0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
8eb0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
8ec0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8ed0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
8ee0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
8ef0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
8f00: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
8f10: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
8f20: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
8f30: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
8f40: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
8f50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
8f60: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
8f70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8f80: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
8f90: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
8fa0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
8fb0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
8fc0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
8fd0: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
8fe0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
8ff0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9000: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9010: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9020: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
9030: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
9040: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
9050: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
9060: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
9070: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
9080: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
9090: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
90a0: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
90b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
90c0: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
90d0: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
90e0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
90f0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
9100: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
9110: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9120: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9140: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
9150: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
9160: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
9170: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
9180: 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20  , nExpr-iStart, 
9190: 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28  nExtra+1);.  if(
91a0: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
91b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
91c0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
91d0: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
91e0: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
91f0: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
9200: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
9210: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
9220: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9230: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
9240: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
9250: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
9260: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
9270: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
9280: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
9290: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
92a0: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
92b0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
92c0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
92d0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
92e0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
92f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9300: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e  n pInfo;.}..#ifn
9310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9320: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
9330: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9350: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9360: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9370: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9380: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
9390: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
93a0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
93b0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
93c0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
93d0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
93e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
93f0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9400: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9420: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9430: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9450: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9460: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9480: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
9490: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
94a0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
94b0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
94c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
94d0: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
94e0: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
94f0: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9500: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9510: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9520: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9530: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9540: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9550: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
9560: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
9570: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
9580: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
9590: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
95a0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
95b0: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
95c0: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
95d0: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
95e0: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
95f0: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
9600: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
9610: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
9620: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
9630: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
9640: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
9650: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9660: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
9670: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
9680: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
9690: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
96a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
96b0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
96c0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
96d0: 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42  >db, "USE TEMP B
96e0: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
96f0: 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  Usage);.    sqli
9700: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9710: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
9720: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
9730: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
9740: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
9750: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70  /*.** Assign exp
9760: 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61  ression b to lva
9770: 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c  lue a. A second,
9780: 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20   no-op, version 
9790: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a  of this macro.**
97a0: 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65   is provided whe
97b0: 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  n SQLITE_OMIT_EX
97c0: 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64  PLAIN is defined
97d0: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
97e0: 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c  e code.** in sql
97f0: 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20  ite3Select() to 
9800: 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f  assign values to
9810: 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65   structure membe
9820: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
9830: 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69  .** only exist i
9840: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9850: 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66  PLAIN is not def
9860: 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c  ined without pol
9870: 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  luting the.** co
9880: 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20  de with #ifndef 
9890: 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23  directives..*/.#
98a0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
98b0: 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20  etInteger(a, b) 
98c0: 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20  a = b..#else./* 
98d0: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
98e0: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
98f0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
9900: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
9910: 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70  fine explainTemp
9920: 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66  Table(y,z).# def
9930: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
9940: 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69  teger(y,z).#endi
9950: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9970: 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  AIN) && !defined
9980: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
9990: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a  POUND_SELECT)./*
99a0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
99b0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
99c0: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
99d0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
99e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
99f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9a00: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9a10: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9a20: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
9a30: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
9a40: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
9a50: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
9a60: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
9a70: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
9a80: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
9a90: 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a  d iSub2 (op)".**
9aa0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
9ab0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
9ac0: 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54  nd iSub2 USING T
9ad0: 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22  EMP B-TREE (op)"
9ae0: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75  .**.** where iSu
9af0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65  b1 and iSub2 are
9b00: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61   the integers pa
9b10: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72  ssed as the corr
9b20: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e  esponding.** fun
9b30: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ction parameters
9b40: 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20  , and op is the 
9b50: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
9b60: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ion of the param
9b70: 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73  eter.** of the s
9b80: 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61  ame name. The pa
9b90: 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73  rameter "op" mus
9ba0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  t be one of TK_U
9bb0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
9bc0: 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  .** TK_INTERSECT
9bd0: 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20   or TK_ALL. The 
9be0: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73  first form is us
9bf0: 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62  ed if argument b
9c00: 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61  UseTmp is .** fa
9c10: 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f  lse, or the seco
9c20: 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73  nd form if it is
9c30: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
9c40: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d   void explainCom
9c50: 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20  posite(.  Parse 
9c60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9c80: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
9c90: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  /* One of TK_UNI
9cc0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74  ON, TK_EXCEPT et
9cd0: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  c. */.  int iSub
9ce0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9d00: 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e  ery id 1 */.  in
9d10: 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20  t iSub2,        
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d30: 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a   Subquery id 2 *
9d40: 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20  /.  int bUseTmp 
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
9d70: 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20   temp table was 
9d80: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
9d90: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ert( op==TK_UNIO
9da0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45  N || op==TK_EXCE
9db0: 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
9dc0: 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  ERSECT || op==TK
9dd0: 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50  _ALL );.  if( pP
9de0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
9df0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
9e00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9e10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
9e20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9e30: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
9e40: 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  ->db, "COMPOUND 
9e50: 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e  SUBQUERIES %d AN
9e60: 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53  D %d %s(%s)", iS
9e70: 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20  ub1, iSub2,.    
9e80: 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49      bUseTmp?"USI
9e90: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22  NG TEMP B-TREE "
9ea0: 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  :"", selectOpNam
9eb0: 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20  e(op).    );.   
9ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ed0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9ee0: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9ef0: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
9f00: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
9f10: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d  }.}.#else./* No-
9f20: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
9f30: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
9f40: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
9f50: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
9f60: 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  e explainComposi
9f70: 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  te(v,w,x,y,z).#e
9f80: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
9f90: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
9fa0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
9fb0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
9fc0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
9fd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
9fe0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
9ff0: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
a000: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
a010: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
a020: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
a030: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
a040: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
a050: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
a060: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
a070: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
a080: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
a090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
a0a0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
a0b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a0c0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a0d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
a0e0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
a0f0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
a100: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74  tement */.  Sort
a110: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a  Ctx *pSort,   /*
a120: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   Information on 
a130: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
a140: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  use */.  int nCo
a150: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
a160: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a170: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
a180: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
a190: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
a1a0: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
a1b0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
a1c0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
a1f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
a200: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  /.  int addrBrea
a210: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
a220: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20  akeLabel(v);    
a230: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
a240: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
a250: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
a260: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a270: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
a280: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
a290: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
a2a0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64  t addr;.  int ad
a2b0: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
a2c0: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
a2d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
a2e0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
a2f0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
a300: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
a310: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
a320: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
a330: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
a340: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b  gRowid;.  int nK
a350: 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54  ey;.  int iSortT
a360: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
a370: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
a380: 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66  cursor to read f
a390: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f  rom */.  int nSo
a3a0: 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  rtData;         
a3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69           /* Trai
a3c0: 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72  ling values to r
a3d0: 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20  ead from sorter 
a3e0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
a3f0: 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20  t bSeq;         
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a410: 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20   True if sorter 
a420: 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20  record includes 
a430: 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64  seq. no. */.#ifd
a440: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a450: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
a460: 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  S.  struct ExprL
a470: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
a480: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
a490: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
a4a0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a4b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a4c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a4d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
a4e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
a4f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a510: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
a520: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
a530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
a540: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
a550: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a560: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
a570: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
a580: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a590: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
a5a0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
a5b0: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a5c0: 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d   0;.    regRow =
a5d0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
a5e0: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e     nSortData = n
a5f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
a600: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
a610: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a620: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
a630: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
a640: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a650: 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  );.    nSortData
a660: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79   = 1;.  }.  nKey
a670: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
a680: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
a690: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
a6a0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
a6b0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
a6c0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
a6d0: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
a6e0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
a6f0: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
a700: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
a710: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a720: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
a730: 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ce = sqlite3Code
a740: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
a750: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a760: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a770: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a780: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
a790: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
a7a0: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
a7b0: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
a7c0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
a7d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a7e0: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
a7f0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
a800: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a810: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
a820: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
a830: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a840: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a850: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a860: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a880: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
a890: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
a8a0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
a8b0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
a8c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a8d0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
a8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a8f0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
a900: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
a910: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a920: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a930: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a940: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
a950: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
a960: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
a970: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
a980: 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a  SortData; i++){.
a990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a9b0: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b  mn, iSortTab, nK
a9c0: 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f  ey+bSeq+i, regRo
a9d0: 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  w+i);.    VdbeCo
a9e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
a9f0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
aa00: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
aa10: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
aa20: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
aa30: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
aa40: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
aa50: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
aa60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa70: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
aa80: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
aa90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aaa0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
aab0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
aac0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
aad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aae0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
aaf0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
ab00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ab10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ab20: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
ab30: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
ab40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ab50: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
ab60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
ab80: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
ab90: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
abc0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
abd0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
abe0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
abf0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
ac00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ac20: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
ac30: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
ac40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
ac60: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
ac70: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ac80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ac90: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
aca0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
acb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
acc0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
acd0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
ace0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
acf0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
ad00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ad10: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
ad20: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
ad30: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
ad40: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ad50: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
ad60: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ad70: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ad80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ad90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
ada0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
adb0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
adc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
add0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ade0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
adf0: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ae00: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
ae10: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
ae20: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ae30: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
ae40: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ae50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae70: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ae80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ae90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aea0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
aeb0: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
aec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
aed0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
aee0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
aef0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
af00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
af10: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
af20: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
af30: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
af40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
af50: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
af60: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
af70: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
af80: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
af90: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
afa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
afb0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
afc0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
afd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
afe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
aff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b000: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
b010: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
b020: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
b030: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
b040: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
b050: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
b060: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
b070: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
b080: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b090: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
b0a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
b0b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b0c0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
b0d0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
b0e0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
b0f0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
b100: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
b110: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
b120: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
b130: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
b140: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
b150: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
b160: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b170: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
b180: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
b190: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
b1a0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
b1b0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
b1c0: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
b1d0: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
b1e0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
b1f0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
b200: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
b210: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b220: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
b230: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
b240: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
b250: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
b260: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
b270: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
b280: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
b290: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
b2a0: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
b2b0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
b2c0: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
b2d0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
b2e0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
b2f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
b300: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
b310: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
b320: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
b330: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
b340: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
b350: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
b360: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
b370: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
b380: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
b390: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
b3a0: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
b3b0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
b3c0: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
b3d0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
b3e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b3f0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
b400: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
b410: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
b420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
b430: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
b440: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
b450: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
b460: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
b470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b480: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
b490: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
b4a0: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
b4b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b4c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b4d0: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
b4e0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
b4f0: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
b500: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23  l(A,B,C,D,E,F).#
b510: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
b520: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b530: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b540: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
b550: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b560: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b570: 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e  eImpl(A,B,F).#en
b580: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
b590: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
b5a0: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
b5b0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
b5c0: 70 72 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65  pr *pExpr,.#ifde
b5d0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b5e0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
b600: 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74  zOrigDb,.  const
b610: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61   char **pzOrigTa
b620: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b630: 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e  **pzOrigCol,.#en
b640: 64 69 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69  dif.  u8 *pEstWi
b650: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
b660: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
b670: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
b680: 74 57 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64  tWidth = 1;.#ifd
b690: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b6a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b6b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b6c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
b6d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
b6e0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
b6f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
b700: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   0;.#endif..  if
b710: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
b720: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
b730: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
b740: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b750: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b760: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
b770: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
b780: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
b790: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
b7a0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
b7b0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
b7c0: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
b7d0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
b7e0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
b7f0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
b800: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
b810: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
b820: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
b830: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
b840: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
b850: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
b860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
b870: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
b880: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b890: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b8a0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b8c0: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
b8d0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
b8e0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
b8f0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
b900: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
b910: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
b920: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
b930: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b940: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b950: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b960: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b970: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b980: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
b990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
b9a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b9b0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
b9c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b9d0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
b9e0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
b9f0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
ba00: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
ba10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
ba20: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
ba30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
ba40: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ba50: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
ba60: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
ba70: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
ba80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba90: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
baa0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
bab0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
bac0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
bad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
bae0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
baf0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
bb00: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
bb10: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
bb20: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
bb30: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
bb40: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
bb50: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
bb60: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
bb70: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
bb80: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
bb90: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
bba0: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
bbb0: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
bbc0: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
bbd0: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
bbe0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
bbf0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
bc00: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
bc10: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
bc20: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
bc30: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
bc40: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
bc50: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
bc60: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
bc70: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
bc80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bc90: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
bca0: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
bcb0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
bcc0: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
bcd0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
bce0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
bcf0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
bd00: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
bd10: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
bd20: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
bd30: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
bd40: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
bd50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bd60: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
bd70: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
bd80: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
bd90: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
bda0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
bdb0: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
bdc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
bdd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
bde0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
bdf0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
be00: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
be10: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
be20: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
be30: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
be40: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
be50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
be60: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
be70: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
be80: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
be90: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
bea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
beb0: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
bec0: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
bed0: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
bee0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
bef0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
bf00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
bf10: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
bf20: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
bf30: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
bf40: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
bf50: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
bf60: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
bf70: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
bf80: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
bf90: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
bfa0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
bfc0: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
bfd0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
bfe0: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
bff0: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
c000: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
c010: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
c020: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
c030: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
c040: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
c050: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
c060: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
c070: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
c080: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
c090: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
c0a0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c0b0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
c0c0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c0d0: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c0e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c0f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c100: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c110: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c120: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c130: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c140: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c150: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c160: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c170: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c180: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c1a0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c1b0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c1c0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c1d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c1e0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c1f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c200: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c210: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c220: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c230: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c240: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c250: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c260: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c270: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c280: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c290: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c2a0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c2b0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c2c0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c2e0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c2f0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c300: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c310: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c320: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c330: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c340: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c350: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c360: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c370: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c380: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c390: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c3a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c3b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c3c0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c3d0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c3e0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c3f0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c400: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c410: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c420: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c430: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c450: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c460: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c470: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c480: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c490: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c4a0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c4b0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c4c0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c4d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c500: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c510: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c520: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c530: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c540: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c550: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c560: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c570: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c580: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c590: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c5a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c5b0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c5c0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c5d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c5e0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c5f0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c600: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c610: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c620: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c630: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c640: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c650: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c660: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c670: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c680: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c690: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c6a0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c6b0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c6c0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c6d0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c6e0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c6f0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c700: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c710: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c720: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c730: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c740: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c750: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c760: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c770: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c780: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c790: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c7a0: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c7b0: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c7c0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c7d0: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c7e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c7f0: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c800: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c810: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c820: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c840: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c850: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c860: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c870: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c880: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c890: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c8a0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c8b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c8c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c8d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c8e0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c8f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c900: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
c910: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
c920: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
c930: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
c940: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
c950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
c960: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
c970: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
c990: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
c9a0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
c9b0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
c9c0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c9d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
c9e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c9f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
ca00: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
ca10: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
ca20: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
ca30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ca40: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ca50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ca60: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
ca70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
ca80: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
ca90: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
caa0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
cab0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cac0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
cad0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
cae0: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
caf0: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
cb00: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
cb10: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
cb20: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
cb30: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
cb40: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
cb50: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
cb60: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
cb70: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cb80: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cb90: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cba0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cbb0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cbc0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
cbd0: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
cbe0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cc10: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cc20: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
cc30: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cc50: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cc60: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
cc70: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cc80: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cc90: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cca0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ccb0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
ccc0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
ccd0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cce0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
ccf0: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
cd00: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cd10: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
cd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cd30: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
cd40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cd50: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cd60: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
cd70: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
cd80: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
cd90: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
cda0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
cdb0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
cdc0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
cdd0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
cde0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
cdf0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
ce00: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
ce10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ce20: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
ce30: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
ce40: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
ce50: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
ce60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
ce70: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
ce80: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
ce90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cea0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ceb0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cec0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
ced0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cee0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
cef0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
cf00: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
cf10: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cf20: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
cf30: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
cf40: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
cf50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
cf60: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
cf70: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
cf80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
cf90: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
cfa0: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
cfb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
cfc0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
cfd0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
cfe0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
cff0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d000: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d010: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
d020: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
d030: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
d040: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
d050: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d060: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
d070: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
d080: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d090: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d0a0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
d0b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d0c0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d0d0: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d0e0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d0f0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d100: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d110: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d120: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d130: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d140: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d150: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d160: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d170: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d180: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d190: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d1a0: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d1b0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d1c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d1d0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d1e0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d1f0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d200: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d210: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d220: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d230: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d240: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d250: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d270: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d280: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d290: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d2a0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d2b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d2c0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d2d0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d2e0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d2f0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d300: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d310: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d320: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d330: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d350: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d360: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d380: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d390: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d3b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d3c0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d3e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d3f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d400: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d410: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d420: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d430: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d440: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d450: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d460: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d470: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d480: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d4b0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d4c0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d4d0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d4e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d4f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d500: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d510: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d520: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d540: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d550: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d560: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d570: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d580: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d590: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d5a0: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d5b0: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d5d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d5e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d5f0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d600: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d610: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d620: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d630: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d640: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d650: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d660: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d670: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d680: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d690: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d6a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d6b0: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d6c0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d6d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d6e0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d6f0: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d700: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d710: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d720: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d730: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d740: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d750: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d760: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d770: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d780: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d790: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d7a0: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d7b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d7c0: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d7d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d7e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d7f0: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d800: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d810: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d820: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d830: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
d840: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d850: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d860: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d870: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d880: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d890: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
d8a0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
d8b0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
d8c0: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
d8d0: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
d8e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d8f0: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
d900: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
d910: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
d920: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
d930: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
d940: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
d950: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d960: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d970: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
d980: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d990: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
d9c0: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9e0: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
d9f0: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
da00: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
da10: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
da20: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
da30: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
da40: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
da50: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
da60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
da70: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
da80: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
da90: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
dac0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
dad0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
dae0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
db10: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db30: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
db40: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
db50: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
db60: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
db70: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
db80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
db90: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
dba0: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
dbb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
dbc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
dbd0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
dbe0: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
dbf0: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
dc00: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
dc10: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
dc20: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
dc30: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
dc40: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
dc50: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
dc60: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
dc70: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
dc80: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
dc90: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
dca0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
dcb0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
dcc0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dcd0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dcf0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dd00: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dd10: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dd20: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
dd30: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
dd40: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
dd50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd60: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
dd70: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
dd80: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
dd90: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
dda0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
ddb0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
ddc0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
ddd0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dde0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
ddf0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
de00: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
de10: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
de20: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
de30: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
de40: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
de50: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
de60: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
de70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
de80: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
de90: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
dea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
deb0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
dec0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
ded0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
dee0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
def0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
df00: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
df10: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
df20: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
df30: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
df40: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
df50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
df60: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
df80: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
df90: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
dfa0: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
dfb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
dfc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
dfd0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
dfe0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
dff0: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
e000: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
e010: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
e020: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
e030: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
e040: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
e050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e060: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
e070: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
e080: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
e090: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
e0a0: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
e0b0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e0c0: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e0d0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e0f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e100: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
e110: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e120: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e140: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e150: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e160: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e170: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e180: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e190: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e1a0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e1b0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e1c0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e1d0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e1e0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e1f0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e200: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e210: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e220: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e230: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e240: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e250: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e260: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e270: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e280: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e290: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e2a0: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e2b0: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e2c0: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e2d0: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e2e0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e2f0: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e300: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e310: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e320: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e340: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e350: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e360: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e370: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e380: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e390: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e3b0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e3c0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e3d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e3e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e3f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e410: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e420: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e430: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e440: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e450: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e460: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e470: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e4a0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e4b0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e4c0: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e4d0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e4e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e4f0: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e500: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e510: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e520: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e530: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e540: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e550: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e560: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e570: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e580: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e590: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e5a0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e5b0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e5c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e5d0: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e5e0: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e5f0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e600: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e620: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e630: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e640: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e650: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e660: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e670: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e680: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e690: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e6a0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e6b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e6c0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e6d0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e6e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e6f0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e700: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e710: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e720: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e730: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e740: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e750: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e760: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e770: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e780: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e790: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e7a0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e7c0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e7d0: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e7e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e7f0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e800: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e810: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e820: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e840: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
e850: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
e860: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
e870: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
e880: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
e890: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e8a0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
e8b0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
e8c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e8d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
e8e0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
e8f0: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 54 79     if( pCol->zTy
e900: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pe==0 ){.      p
e910: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
e920: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e930: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e940: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
e950: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
e960: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
e970: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ));.    }.    sz
e980: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e990: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e9a0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9b0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
e9d0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
e9e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
e9f0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
ea00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea20: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea30: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
ea40: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
ea50: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
ea60: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ea70: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
ea80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ea90: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
eaa0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
eab0: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
eac0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
ead0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
eae0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
eaf0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
eb00: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
eb10: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
eb20: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
eb30: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
eb40: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
eb50: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
eb60: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
eb70: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
eb80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb90: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
eba0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
ebb0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
ebc0: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ebd0: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
ebe0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
ebf0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
ec00: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
ec10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ec20: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
ec30: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ec40: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ec50: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
ec60: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
ec70: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
ec80: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
ec90: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
eca0: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
ecb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ecc0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
ecd0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
ece0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
ecf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
ed00: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
ed10: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
ed20: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
ed30: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
ed40: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
ed50: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
ed60: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
ed70: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
ed80: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
ed90: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
eda0: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
edb0: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
edc0: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
edd0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
ede0: 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74  576) );.  select
edf0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ee00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ee10: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ee20: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ee30: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
ee40: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
ee50: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
ee60: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
ee70: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
ee80: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
ee90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
eea0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
eeb0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
eec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
eed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
eee0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
eef0: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
ef00: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
ef10: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
ef20: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ef30: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
ef40: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
ef50: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
ef60: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
ef70: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
ef80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
ef90: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
efa0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
efb0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
efc0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
efd0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
efe0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
eff0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f000: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
f010: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
f020: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
f030: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f040: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
f050: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
f060: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
f070: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
f080: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
f090: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f0a0: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
f0b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
f0c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f0d0: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
f0e0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
f0f0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
f100: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
f110: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f120: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
f130: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f140: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
f150: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
f160: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
f170: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
f180: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
f190: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
f1a0: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
f1b0: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f1c0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f1d0: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f1e0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f1f0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f200: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f210: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f220: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f230: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f240: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f250: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f260: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f270: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f280: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f290: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f2a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f2b0: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f2c0: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f2d0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f2e0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f2f0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f300: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f310: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f320: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f330: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f340: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f350: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f360: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f370: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f380: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f390: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f3a0: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f3b0: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f3c0: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f3d0: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f3e0: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f3f0: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f400: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f410: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f420: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f430: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f440: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f450: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f460: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f470: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f480: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f490: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f4a0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f4b0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f4c0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f4d0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f4e0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f4f0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f500: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f510: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f520: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f530: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f540: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f550: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f560: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f570: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f580: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f590: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f5a0: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a    int addr1, n;.
f5b0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
f5c0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
f5d0: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
f5e0: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
f5f0: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
f600: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
f610: 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
f620: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
f630: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
f640: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
f650: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
f660: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
f670: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
f680: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
f690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f6a0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
f6b0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
f6c0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
f6d0: 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
f6e0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
f6f0: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
f700: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
f710: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
f720: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f730: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
f740: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
f750: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
f760: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
f770: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
f780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f790: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f7a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
f7b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f7c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f7d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f7e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
f7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f800: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
f810: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
f820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
f830: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
f840: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
f850: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
f860: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
f870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f880: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f890: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
f8a0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
f8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f8c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f8d0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
f8e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f8f0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f900: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f910: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f930: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
f940: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
f950: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f970: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
f980: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
f990: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
f9a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f9b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
f9c0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
f9d0: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
f9e0: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
f9f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fa00: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fa10: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
fa20: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
fa30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa40: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fa50: 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
fa60: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa70: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fa80: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
fa90: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
faa0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
fab0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
fac0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  s, iOffset); Vdb
fad0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
faf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
fb00: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
fb10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fb30: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ddr1);.      sql
fb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fb50: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
fb60: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
fb70: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
fb80: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
fb90: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
fba0: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
fbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fbc0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
fbd0: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
fbe0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
fc10: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
fc20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fc30: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
fc50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc60: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
fc70: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
fc80: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
fc90: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fca0: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
fcb0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
fcc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
fcd0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
fce0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fcf0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
fd00: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
fd10: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
fd20: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
fd30: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
fd40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fd50: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
fd60: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
fd70: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
fd80: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
fd90: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
fda0: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
fdb0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
fdc0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
fdd0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fde0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
fdf0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
fe00: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
fe10: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
fe20: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
fe30: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
fe40: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
fe50: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
fe60: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
fe70: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
fe80: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
fe90: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
fea0: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
feb0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
fec0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
fed0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
fee0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
fef0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
ff00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ff10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
ff20: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
ff30: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
ff40: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
ff50: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
ff60: 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
ff70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
ff80: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
ff90: 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
ffa0: 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
ffb0: 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
ffc0: 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
ffd0: 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
ffe0: 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
fff0: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
10000 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
10010 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10020 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
10030 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
10040 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10050 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10060 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10070 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10080 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10090 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
100a0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
100b0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
100c0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
100d0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
100e0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
100f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
10100 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
10110 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10120 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
10130 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10140 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10150 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10160 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
10170 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
10180 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
10190 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
101a0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
101b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
101c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
101d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
101e0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
101f0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
10200 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
10210 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10220 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
10230 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
10240 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
10250 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10260 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10270 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
10280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10290 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
102a0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
102b0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
102c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
102d0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
102e0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
102f0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
10300 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
10310 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
10320 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10330 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
10340 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
10350 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
10360 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
10370 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10380 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10390 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
103a0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
103b0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
103c0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
103d0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
103e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
103f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
10400 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
10410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10420 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
10430 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
10440 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
10450 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
10460 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
10470 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
10480 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
10490 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
104a0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
104b0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
104c0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
104d0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10500 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
10510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
10520 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
10540 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
10560 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
10570 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
10580 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
10590 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
105a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
105b0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
105c0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
105d0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
105e0 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65  >a[].isRecursive
105f0 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
10600 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
10610 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
10620 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
10630 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
10640 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
10650 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
10660 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
10670 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
10680 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
10690 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
106a0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
106b0 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
106c0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
106d0 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
106e0 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
106f0 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
10700 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
10710 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
10720 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
10730 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
10740 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
10750 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
10760 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
10770 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
10780 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
10790 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
107a0 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
107b0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
107c0 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
107d0 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
107e0 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
107f0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
10800 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
10810 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
10820 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
10830 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
10840 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
10850 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
10860 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
10870 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
10880 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
10890 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
108a0 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
108b0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
108c0 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
108d0 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
108e0 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
108f0 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
10900 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
10910 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
10920 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
10930 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
10940 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
10950 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
10960 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
10970 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
10980 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
10990 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
109a0 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
109b0 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
109c0 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
109d0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
109e0 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
109f0 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
10a00 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
10a10 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
10a20 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
10a30 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
10a40 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
10a50 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
10a60 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
10a70 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
10a80 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
10a90 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
10aa0 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
10ab0 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
10ac0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
10ad0 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
10ae0 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
10af0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
10b00 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
10b10 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
10b20 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
10b30 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
10b40 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
10b50 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
10b60 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
10b70 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
10b80 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
10b90 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
10ba0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
10bb0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
10bc0 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
10bd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10be0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10bf0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
10c00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10c10 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
10c20 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
10c30 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
10c40 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
10c50 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
10c60 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
10c70 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
10c80 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
10c90 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
10ca0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
10cb0 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
10cc0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
10cd0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
10ce0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
10cf0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
10d00 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
10d10 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10d20 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
10d30 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
10d40 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
10d50 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10d60 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
10d70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
10d80 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
10d90 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
10da0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
10db0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
10dc0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
10dd0 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
10de0 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
10df0 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
10e00 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
10e10 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
10e20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10e30 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
10e40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
10e50 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
10e60 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10e70 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
10e80 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
10e90 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10eb0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10ec0 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
10ed0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10ee0 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
10ef0 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
10f00 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
10f10 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
10f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
10f30 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
10f40 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
10f50 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
10f60 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
10f70 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
10f80 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10f90 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10fc0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10ff0 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
11000 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
11010 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
11020 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11030 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
11040 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
11050 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
11060 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
11070 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
11080 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
11090 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
110a0 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
110b0 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
110c0 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
110d0 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
110e0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
110f0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11100 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11110 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
11120 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
11130 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
11140 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
11150 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
11160 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
11170 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
11180 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11190 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
111a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
111b0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
111c0 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
111d0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66  ->pLimit;.  pOff
111e0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
111f0 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70  ;.  regLimit = p
11200 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f  ->iLimit;.  regO
11210 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
11220 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  et;.  p->pLimit 
11230 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  = p->pOffset = 0
11240 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
11250 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
11260 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
11270 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
11280 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
11290 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
112a0 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
112b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
112c0 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
112d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
112e0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63  pSrc->a[i].isRec
112f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
11300 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
11310 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
11320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11330 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
11340 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
11350 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
11360 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
11370 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
11380 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
11390 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
113a0 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
113b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
113c0 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
113d0 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
113e0 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
113f0 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
11400 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
11410 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
11420 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
11430 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11440 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
11450 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11460 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
11470 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
11480 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
11490 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
114a0 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
114b0 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
114c0 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
114d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
114e0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
114f0 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
11500 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
11510 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
11520 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
11530 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
11540 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
11550 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11560 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
11570 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
11580 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
11590 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
115a0 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
115b0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
115c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
115d0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
115e0 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
115f0 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
11600 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11610 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11620 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
11630 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
11640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11650 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11660 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11670 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
11680 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
11690 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
116a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
116b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
116c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
116d0 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
116e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
116f0 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
11700 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
11710 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
11720 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
11730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11740 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11750 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
11760 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
11770 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
11780 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
11790 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
117a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
117b0 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
117c0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
117d0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
117e0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
117f0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
11800 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
11810 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
11820 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
11830 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11840 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
11850 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
11860 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
11870 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
11880 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
11890 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
118a0 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
118b0 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
118c0 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
118d0 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
118e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
118f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
11900 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
11910 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
11920 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
11930 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
11940 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
11950 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
11960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11970 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
11980 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
11990 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
119a0 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
119b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
119c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
119d0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
119e0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
119f0 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
11a00 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
11a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
11a30 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
11a40 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
11a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11a60 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
11a70 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
11a80 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
11a90 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11aa0 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
11ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11ac0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
11ad0 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
11ae0 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
11af0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11b00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
11b10 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c  EList, iCurrent,
11b20 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
11b30 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
11b40 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
11b50 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
11b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
11b80 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
11b90 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
11ba0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11bc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11bd0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
11be0 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
11bf0 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11c00 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
11c10 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11c20 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
11c30 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
11c40 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
11c50 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
11c60 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
11c70 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11c90 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11ca0 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65  stQueue);.  asse
11cb0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
11cc0 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   );.  p->pPrior 
11cd0 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20  = pSetup;..  /* 
11ce0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
11cf0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
11d00 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
11d10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
11d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11d30 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
11d40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11d50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
11d60 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
11d70 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
11d80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11d90 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
11da0 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
11db0 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
11dc0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
11dd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
11de0 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  t;.  p->pOffset 
11df0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74  = pOffset;.  ret
11e00 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11e20 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
11e30 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
11e40 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
11e50 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
11e60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11e70 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11e80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11e90 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11ea0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
11eb0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
11ec0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
11ed0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
11ee0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
11ef0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
11f00 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
11f10 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
11f20 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
11f30 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
11f40 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
11f50 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
11f60 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
11f70 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   sets..*/.static
11f80 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f 6e   void selectWron
11f90 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
11fa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11fb0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
11fc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
11fd0 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
11fe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11ff0 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
12000 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
12010 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
12020 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
12030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12040 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
12050 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
12060 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
12070 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
12080 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12090 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
120a0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
120b0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
120c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  ;.  }.}../*.** H
120d0 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
120e0 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
120f0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
12100 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12110 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12120 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12130 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
12140 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
12150 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
12160 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
12170 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
12180 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
12190 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
121a0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
121b0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
121c0 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
121d0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
121e0 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
121f0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
12200 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12210 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12220 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12230 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
12240 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
12250 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12260 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
12270 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
12280 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
12290 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
122a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
122b0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
122c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
122d0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
122e0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
122f0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12300 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12310 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12320 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12330 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
12340 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
12350 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
12360 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  ist->nExpr;.  in
12370 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
12380 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
12390 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
123a0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
123b0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
123c0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
123d0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
123e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
123f0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
12400 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
12410 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
12420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12430 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
12440 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12450 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
12460 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
12470 45 78 70 72 21 3d 6e 45 78 70 72 20 29 7b 0a 20  Expr!=nExpr ){. 
12480 20 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67       selectWrong
12490 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
124a0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
124b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
124c0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
124d0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
124e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
124f0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
12500 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
12510 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
12520 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
12530 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
12540 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
12550 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
12560 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
12570 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12580 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
12590 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
125a0 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
125b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
125c0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
125d0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
125e0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
125f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12610 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
12620 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
12630 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
12640 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
12650 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
12660 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
12670 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
12680 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
12690 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
126a0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
126b0 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
126c0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
126d0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
126e0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
126f0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
12700 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
12710 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
12720 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
12730 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12740 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
12750 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
12760 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
12770 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
12780 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
12790 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
127a0 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
127b0 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
127c0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
127d0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
127e0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
127f0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
12800 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
12810 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
12820 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
12830 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
12840 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
12860 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
12870 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
12880 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
12890 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
128a0 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
128b0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
128c0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
128d0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
128e0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
128f0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
12900 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
12910 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
12920 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
12930 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
12940 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
12950 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
12960 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12970 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
12980 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
12990 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
129a0 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
129b0 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
129c0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
129d0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
129e0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
129f0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
12a00 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
12a10 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
12a20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
12a30 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
12a40 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
12a50 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
12a60 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
12a70 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
12a80 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12aa0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12ac0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12ad0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12ae0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12af0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12b00 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12b10 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
12b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
12b40 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
12b50 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
12b60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
12b70 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
12b80 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
12b90 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
12ba0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
12bb0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12bc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12bd0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
12be0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12bf0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
12c00 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
12c10 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
12c20 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
12c30 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
12c40 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
12c50 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
12c60 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
12c70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12c80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
12c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12ca0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
12cb0 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
12cc0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12cd0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
12ce0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
12cf0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12d00 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
12d10 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
12d20 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
12d30 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
12d40 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12d50 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
12d60 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
12d70 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
12d80 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
12d90 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
12da0 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
12db0 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
12dc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
12dd0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
12de0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
12df0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
12e00 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
12e10 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
12e20 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
12e30 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
12e40 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
12e50 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
12e60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12e70 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
12e80 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
12e90 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
12ea0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
12eb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12ec0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
12ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
12ee0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
12ef0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
12f00 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
12f10 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
12f20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
12f30 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12f40 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
12f50 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
12f60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12f70 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
12f80 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
12f90 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
12fa0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
12fb0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
12fc0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
12fd0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
12fe0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
12ff0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13000 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13010 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13020 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
13030 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
13040 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
13050 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
13060 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
13070 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
13080 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
13090 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
130a0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
130b0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
130c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
130d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
130e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
130f0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
13100 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
13110 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
13120 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13130 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
13140 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
13150 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
13160 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
13170 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
13180 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
13190 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
131a0 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
131b0 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
131c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
131d0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
131e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
131f0 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
13200 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13210 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13220 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13230 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13240 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
13250 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
13260 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
13270 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
13280 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
13290 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
132a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
132b0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
132c0 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
132d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
132e0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
132f0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 65 6c  nExpr ){.    sel
13300 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
13310 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 29  Error(pParse, p)
13320 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
13330 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13340 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69  ect_end;.  }..#i
13350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13360 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
13370 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
13380 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
13390 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
133a0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
133b0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
133c0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
133d0 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
133e0 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
133f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
13400 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
13410 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
13420 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13430 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
13440 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
13450 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
13460 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
13470 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
13480 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
13490 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
134a0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
134b0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
134c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
134d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
134e0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
134f0 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
13500 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
13510 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
13520 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
13530 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
13540 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
13550 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
13560 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
13570 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
13580 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13590 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
135a0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
135b0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
135c0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
135d0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
135e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
135f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
13600 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
13610 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
13620 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
13630 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
13640 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
13650 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13660 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
13670 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
13680 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
13690 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
136a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
136b0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
136c0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
136d0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
136e0 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
136f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13700 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
13710 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
13720 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13730 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13740 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
13750 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
13760 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
13770 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13780 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
13790 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
137a0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
137b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
137c0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
137d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
137e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137f0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
13800 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13810 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
13820 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13830 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
13840 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
13850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
13860 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
13870 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
13880 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
13890 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
138a0 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
138b0 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
138c0 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
138d0 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
138e0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
138f0 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
13900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13910 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
13920 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13930 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13960 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
13970 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
13980 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
13990 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
139a0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
139b0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
139c0 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
139d0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
139f0 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
13a00 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
13a10 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
13a20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
13a30 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
13a40 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
13a50 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
13a60 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
13a70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
13a80 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
13a90 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
13aa0 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
13ab0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
13ac0 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13ad0 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
13ae0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13af0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13b00 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13b10 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
13b20 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
13b30 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
13b40 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
13b50 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
13b60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
13b70 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
13b80 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
13b90 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
13ba0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13bb0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13bd0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13be0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13bf0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13c00 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13c20 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
13c30 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
13c40 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
13c50 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
13c60 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13c70 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
13c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c90 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
13ca0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13cb0 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13cc0 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13cd0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13ce0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13cf0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13d00 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13d10 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13d20 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
13d30 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13d40 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
13d50 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13d60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
13d70 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
13d80 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
13d90 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
13da0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13db0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13dc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13dd0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13de0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13df0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13e00 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13e30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13e40 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
13e50 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
13e60 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
13e70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
13e80 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
13e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
13ea0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
13eb0 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
13ec0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
13ed0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13ee0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13ef0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13f00 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13f10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13f20 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
13f30 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13f50 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13f60 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13f70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13f80 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
13f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
13fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13fb0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13fc0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
13fd0 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
13fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ff0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
14000 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14010 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
14020 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
14030 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14040 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14050 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14060 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14070 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14080 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14090 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
140a0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
140b0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
140c0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
140d0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
140e0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
140f0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14100 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14110 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
14120 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
14130 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14140 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
14150 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
14160 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
14170 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
14180 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
14190 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
141a0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
141b0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
141c0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
141d0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
141e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
141f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
14200 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
14210 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14220 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14230 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14240 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
14250 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
14260 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14270 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
14280 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
14290 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
142a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
142b0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
142c0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
142d0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
142e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
142f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
14300 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
14310 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
14320 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
14330 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
14340 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14350 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
14360 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
14370 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
14380 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
14390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
143a0 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
143b0 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
143c0 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
143d0 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
143e0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
143f0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
14400 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
14410 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
14420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14430 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
14440 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14450 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14460 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14470 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14480 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14490 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
144a0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
144b0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
144c0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
144d0 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
144e0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
144f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14500 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14510 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14520 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
14530 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14540 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14550 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14560 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14570 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
14580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14590 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
145a0 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
145b0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
145c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
145d0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
145e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
145f0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
14600 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14610 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
14620 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  ist, unionTab,. 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
14650 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
14660 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
14670 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14680 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
14690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
146a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
146b0 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
146c0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
146d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
146e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
14700 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14720 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
14730 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
14740 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14750 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
14760 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
14770 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
14780 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
14790 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
147a0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
147b0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
147c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
147d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
147e0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
147f0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
14800 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
14810 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
14820 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
14830 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
14840 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
14850 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
14860 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
14870 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
14880 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
14890 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
148a0 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
148b0 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
148c0 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
148d0 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
148e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
148f0 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
14900 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14910 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14920 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
14930 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14950 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14960 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
14970 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14980 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
14990 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
149a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
149b0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
149c0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
149d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
149e0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
149f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14a00 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
14a10 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
14a20 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
14a30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14a40 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
14a50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
14a60 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14a70 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
14a80 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
14a90 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
14aa0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14ab0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14ac0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14ae0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14af0 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
14b00 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
14b10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
14b20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14b30 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
14b40 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
14b50 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
14b60 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
14b70 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
14b80 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
14b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ba0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14bb0 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
14bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14bd0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14be0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14bf0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14c00 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
14c10 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
14c20 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
14c30 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
14c40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
14c50 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
14c60 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
14c70 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14c80 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
14c90 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
14ca0 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
14cb0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14cc0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14cd0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14cf0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14d00 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
14d10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14d30 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14d40 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14d50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14d60 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
14d70 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
14d80 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14d90 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
14da0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14db0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14dc0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14dd0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14de0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14df0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14e00 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
14e10 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
14e20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e30 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
14e40 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
14e50 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
14e60 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
14e70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14e80 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
14e90 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14ea0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14eb0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
14ec0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14ed0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
14ee0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
14ef0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14f00 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
14f10 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14f20 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
14f30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f50 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
14f60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14f70 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
14f80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14fa0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14fb0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14fc0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fe0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14ff0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
15000 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15010 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15020 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15030 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
15040 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15050 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15060 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
15070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15080 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
15090 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
150a0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
150b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
150c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
150d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
150e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
150f0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15100 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
15110 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
15140 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15160 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15170 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
15180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15190 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
151a0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
151b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
151c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
151d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
151e0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
151f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15200 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
15210 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15230 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
15240 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
15260 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15270 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
15280 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
15290 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
152a0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
152b0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
152c0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
152d0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
152e0 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
152f0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
15300 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
15310 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
15320 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
15330 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
15350 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
15360 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
15370 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15380 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
15390 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
153a0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
153b0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
153c0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
153d0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
153e0 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
153f0 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
15400 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15410 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
15420 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
15430 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
15440 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15450 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
15460 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
15470 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15490 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
154a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
154b0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
154c0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
154d0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
154e0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
154f0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15510 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
15520 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
15530 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
15540 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
15550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15560 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
15570 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
15580 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
15590 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
155a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
155b0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
155c0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
155d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
155e0 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
155f0 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
15600 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
15610 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
15620 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
15630 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
15640 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
15650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15660 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
15670 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15680 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
15690 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
156a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
156b0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
156c0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
156d0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
156e0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
156f0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
15700 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
15710 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
15720 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15740 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
15750 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
15760 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
15770 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15780 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
15790 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
157a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
157b0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
157c0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
157d0 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
157e0 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
157f0 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
15800 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
15810 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
15820 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
15830 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
15840 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
15850 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
15860 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
15870 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15880 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
15890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
158a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
158b0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
158c0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
158f0 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
15900 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
15910 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
15940 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
15950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
15960 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
15970 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
15980 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
15990 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
159a0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
159b0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
159c0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
159d0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
159e0 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
159f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15a00 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
15a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
15a20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15a30 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15a40 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
15a50 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
15a60 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
15a70 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
15a80 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
15a90 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
15aa0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
15ab0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
15ac0 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
15ad0 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
15ae0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
15af0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
15b00 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
15b10 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
15b20 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
15b30 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
15b40 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
15b50 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
15b60 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
15b70 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
15b80 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
15b90 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
15ba0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
15bb0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
15bc0 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
15bd0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
15be0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
15bf0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
15c00 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
15c10 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
15c20 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
15c30 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
15c40 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
15c50 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
15c60 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
15c70 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
15c80 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
15c90 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
15ca0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
15cb0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
15cc0 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
15cd0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
15ce0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
15cf0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
15d00 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
15d10 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
15d20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15d30 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15d40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15d50 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15d60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
15d70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
15d80 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15d90 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
15da0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
15db0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
15dc0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
15dd0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
15de0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
15df0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
15e00 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
15e10 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
15e20 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
15e30 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
15e40 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
15e50 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
15e60 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
15e70 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
15e80 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15e90 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
15ea0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
15eb0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
15ec0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
15ed0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15ee0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
15ef0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
15f00 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15f10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15f20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
15f30 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
15f40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15f50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
15f60 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
15f70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15f80 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
15f90 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
15fa0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15fb0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
15fc0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15fd0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
15fe0 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
15ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16000 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
16010 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
16020 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d  age(v);.    j2 =
16030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16040 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
16050 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16060 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16070 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
160a0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
160b0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
160c0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
160d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
160e0 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
160f0 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64  tinue, j2+2); Vd
16100 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16120 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
16130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16140 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
16150 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16160 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16170 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
16180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16190 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
161a0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
161b0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
161c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
161d0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
161e0 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
161f0 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
16200 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
16210 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
16220 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
16230 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
16240 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
16250 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16260 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
16270 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
16280 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
16290 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
162a0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
162b0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
162c0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
162d0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
162e0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
162f0 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
16300 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16310 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16320 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16330 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16340 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16350 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16370 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16380 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16390 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
163c0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
163d0 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
163e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163f0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
16400 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16410 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16420 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16430 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16440 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16450 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16460 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
16470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16480 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16490 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
164a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
164b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
164c0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
164d0 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
164e0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
164f0 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
16500 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
16510 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
16520 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
16530 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
16540 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
16550 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
16560 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
16570 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
16580 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
16590 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
165a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
165b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
165c0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
165d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
165e0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
165f0 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
16600 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
16610 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
16620 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
16630 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
16640 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16650 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16660 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16680 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16690 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
166a0 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
166b0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
166c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
166d0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
166e0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
166f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
16700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16710 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16720 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16730 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16740 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16750 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16770 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16780 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
16790 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
167a0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
167b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
167c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
167d0 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
167e0 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
167f0 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
16800 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
16810 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
16820 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
16830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16840 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16850 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16860 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
16870 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
16880 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16890 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
168a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
168b0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
168c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
168d0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
168e0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
168f0 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
16900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16910 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
16920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16930 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16940 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16950 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16960 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16970 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16980 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16990 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
169a0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
169b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
169c0 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
169d0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
169e0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
169f0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16a00 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16a10 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16a20 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16a30 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16a40 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16a50 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16a60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16a70 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16a80 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16a90 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16aa0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16ab0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16ac0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16ad0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16af0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16b00 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16b10 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16b20 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16b30 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
16b40 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
16b50 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
16b60 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
16b70 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
16b80 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
16b90 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16ba0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16bb0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16bc0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16bd0 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16be0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16bf0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16c00 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16c10 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16c20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16c30 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
16c40 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
16c50 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
16c60 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
16c70 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16c80 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
16c90 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16ca0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16cd0 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16ce0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16d00 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16d10 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16d20 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16d30 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16d40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16d50 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16d60 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16d70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16d80 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16d90 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16db0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
16dc0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
16dd0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
16de0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16e00 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
16e10 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
16e20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16e30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
16e40 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
16e50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16e60 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
16e70 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
16e80 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
16e90 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
16ea0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
16eb0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
16ec0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
16ed0 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
16ee0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
16ef0 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
16f00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16f10 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
16f20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
16f30 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
16f40 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
16f50 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
16f60 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
16f70 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
16f80 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
16f90 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
16fa0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
16fb0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
16fc0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
16fd0 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
16fe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
16ff0 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
17000 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
17010 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
17020 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
17030 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
17040 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
17050 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
17060 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17070 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
17080 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
17090 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
170a0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
170b0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
170c0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
170d0 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
170e0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
170f0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
17100 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17110 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
17120 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
17130 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17140 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
17150 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17160 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17170 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17180 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
17190 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
171a0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
171b0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
171c0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
171d0 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
171e0 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
171f0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
17200 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
17210 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
17220 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
17230 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17240 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17250 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
17260 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
17270 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17280 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
17290 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
172a0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
172b0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
172c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
172d0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
172e0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
172f0 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
17300 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
17310 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17320 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17330 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
17340 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
17350 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17360 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17370 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
17380 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
17390 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
173a0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
173b0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
173c0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
173d0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
173e0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
173f0 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
17400 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
17410 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
17420 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
17430 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
17440 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17450 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17460 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17470 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
17480 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17490 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
174a0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
174b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
174c0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
174d0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
174e0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
174f0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
17500 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
17510 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
17520 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17530 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17540 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
17550 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
17560 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
17570 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17580 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17590 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
175a0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
175b0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
175c0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
175d0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
175e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
175f0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
17600 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
17610 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
17620 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
17630 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
17640 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
17650 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
17660 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
17670 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
17680 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
17690 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
176a0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
176b0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
176c0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
176d0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
176e0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
176f0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
17700 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
17710 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
17720 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
17730 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
17740 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
17750 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
17760 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
17770 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
17780 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
17790 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
177a0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
177b0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
177c0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
177d0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
177e0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
177f0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
17800 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
17810 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
17820 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
17830 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
17840 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
17850 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
17860 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
17870 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
17880 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
17890 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
178a0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
178b0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
178c0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
178d0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
178e0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
178f0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
17900 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17910 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
17920 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
17930 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
17940 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
17950 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
17960 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
17970 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
17980 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
17990 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
179a0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
179b0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
179c0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
179d0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
179e0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
179f0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
17a00 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
17a10 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
17a20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
17a30 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
17a40 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
17a50 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
17a60 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
17a70 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
17a80 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
17a90 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
17aa0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
17ab0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
17ac0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
17ad0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
17ae0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
17af0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
17b00 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
17b10 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
17b20 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
17b30 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
17b40 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
17b50 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
17b60 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
17b70 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
17b80 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
17b90 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
17ba0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
17bb0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
17bc0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
17bd0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
17be0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
17bf0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17c00 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
17c10 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
17c20 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
17c30 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
17c40 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17c50 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
17c60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17c80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
17c90 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
17ca0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
17cb0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
17cc0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
17cd0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
17ce0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
17cf0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
17d00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
17d10 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
17d20 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
17d30 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
17d40 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
17d50 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
17d60 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17d70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17d80 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
17d90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17da0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
17db0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17dc0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
17dd0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
17de0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
17df0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
17e00 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
17e10 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
17e20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
17e30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
17e40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17e50 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
17e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17e70 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17e80 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17e90 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17ea0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
17eb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17ec0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
17ed0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17ee0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
17ef0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17f00 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17f10 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
17f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17f30 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
17f40 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
17f50 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17f60 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
17f70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17f80 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
17f90 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
17fa0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17fb0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
17fc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17fd0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
17fe0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17ff0 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
18000 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18010 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18020 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18030 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
18040 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18050 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
18060 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18070 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18080 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
18090 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
180a0 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
180b0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
180c0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
180d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
180e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
180f0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18100 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18110 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
18120 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18130 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
18140 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
18150 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18160 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
18170 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18180 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
18190 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
181a0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
181b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
181c0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
181d0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
181e0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
181f0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
18200 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
18210 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18220 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18230 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
18240 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
18250 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
18260 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
18270 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18280 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
18290 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
182a0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
182b0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
182c0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
182d0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
182e0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
182f0 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
18300 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18310 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
18320 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
18330 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
18340 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
18350 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
18360 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
18370 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
18380 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
18390 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
183a0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
183b0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
183c0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
183d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
183e0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
183f0 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
18400 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
18410 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18420 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
18430 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
18440 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
18450 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
18460 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
18470 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
18480 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
18490 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
184a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
184b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
184c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
184d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
184e0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
184f0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18500 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
18510 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
18520 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18530 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
18540 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18550 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
18560 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
18570 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
18580 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
18590 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
185a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
185b0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
185c0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
185d0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
185e0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
185f0 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
18600 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
18610 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
18620 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
18630 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
18640 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
18650 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
18660 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
18670 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
18680 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
18690 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
186a0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
186b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
186c0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
186d0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
186e0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
186f0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
18700 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
18710 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18720 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18730 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
18740 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18750 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
18760 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
18770 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
18780 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
18790 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
187a0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
187b0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
187c0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
187d0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
187e0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
187f0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
18800 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
18810 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
18820 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
18830 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
18840 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
18850 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
18860 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
18870 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
18880 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
18890 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
188a0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
188b0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
188c0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
188d0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
188e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
188f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
18900 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
18910 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
18920 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18930 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18940 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
18950 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18960 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
18970 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
18980 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18990 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
189a0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
189b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
189c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
189d0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
189e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
189f0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
18a00 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
18a10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
18a20 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
18a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
18a40 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
18a50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18a60 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18a70 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18a80 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18a90 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18aa0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18ab0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18ac0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18ad0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18ae0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18af0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18b00 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18b10 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18b20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b40 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18b50 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18b60 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18b70 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18b80 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18b90 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18ba0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18bb0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18bc0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18bd0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18be0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18bf0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18c00 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18c10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c20 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18c30 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18c40 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
18c50 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
18c60 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
18c70 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
18c80 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
18c90 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
18ca0 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
18cb0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
18cc0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
18cd0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18ce0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18cf0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18d00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
18d10 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
18d20 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
18d30 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
18d40 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18d50 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18d60 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18d70 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
18d80 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18d90 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
18da0 2d 3e 6e 45 78 70 72 20 29 20 69 73 20 61 6c 73  ->nExpr ) is als
18db0 6f 20 74 72 75 65 0a 20 20 20 20 20 20 2a 2a 20  o true.      ** 
18dc0 62 75 74 20 6f 6e 6c 79 20 66 6f 72 20 77 65 6c  but only for wel
18dd0 6c 2d 66 6f 72 6d 65 64 20 53 45 4c 45 43 54 20  l-formed SELECT 
18de0 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20  statements. */. 
18df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18e00 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18e10 42 79 43 6f 6c 20 3e 20 70 2d 3e 70 45 4c 69 73  ByCol > p->pELis
18e20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
18e30 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
18e40 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18e50 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
18e60 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
18e70 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
18e80 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
18e90 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
18ea0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
18eb0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
18ec0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
18ed0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
18ee0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
18ef0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
18f00 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
18f10 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
18f20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18f30 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
18f40 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
18f50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
18f60 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
18f70 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
18f80 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
18f90 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
18fa0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
18fb0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
18fc0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
18fd0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
18fe0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
18ff0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
19000 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
19010 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
19020 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19030 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
19040 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
19050 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
19060 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
19070 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
19080 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
19090 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
190a0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
190b0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
190c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
190d0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
190e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
190f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
19100 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
19110 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
19120 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
19130 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
19140 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
19150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19160 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
19170 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
19180 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19190 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
191a0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
191b0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
191c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
191d0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
191e0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
191f0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
19200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19210 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
19220 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
19230 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
19240 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
19250 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
19260 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
19270 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
19280 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
19290 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
192a0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
192b0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
192c0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
192d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
192e0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
192f0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
19300 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
19310 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
19320 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
19330 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
19340 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
19350 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
19360 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
19370 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
19380 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
19390 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
193a0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
193b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
193c0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
193d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
193e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193f0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
19400 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
19410 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
19420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
19450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19460 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
19470 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
19480 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
19490 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
194a0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
194b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
194c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
194d0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
194e0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
194f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19500 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
19510 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
19520 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
19530 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19540 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
19550 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19560 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
19570 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
19580 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19590 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
195a0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
195b0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
195c0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
195d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
195e0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
195f0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19600 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
19610 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
19620 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
19630 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19640 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
19650 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
19660 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
19670 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
19680 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19690 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
196a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
196b0 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
196c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
196d0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
196e0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
196f0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
19700 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
19710 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
19720 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
19730 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
19740 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19750 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
19760 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19770 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19780 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
19790 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
197a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
197b0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
197c0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
197d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
197e0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20  e(v, j1);..  /* 
197f0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
19800 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19810 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19820 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
19830 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
19840 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
19850 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
19860 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19870 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
19880 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
19890 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
198a0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
198b0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
198c0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
198d0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
198e0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
198f0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
19900 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
19910 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
19920 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
19930 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
19940 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
19950 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
19960 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
19970 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
19980 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19990 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
199a0 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
199b0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
199c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
199d0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
199e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
199f0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
19a00 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
19a10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19a20 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19a30 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19a40 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
19a50 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19a60 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19a70 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19a80 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19a90 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19aa0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
19ab0 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
19ac0 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
19ad0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19ae0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19b00 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
19b10 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
19b20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19b30 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19b40 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
19b50 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19b60 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19b70 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19b80 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
19b90 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19ba0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19bb0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19bc0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
19bd0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
19be0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
19bf0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19c00 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19c10 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
19c20 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
19c30 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19c40 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c60 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
19c70 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19c90 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19ca0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
19cb0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
19cc0 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
19cd0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19ce0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
19cf0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
19d00 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
19d10 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
19d20 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19d30 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
19d40 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19d50 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
19d60 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
19d70 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19d80 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
19d90 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
19da0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
19db0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19dc0 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
19dd0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
19de0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
19df0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19e00 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
19e10 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
19e20 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
19e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19e40 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19e50 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
19e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19e90 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19ea0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19eb0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19ec0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
19ed0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
19ee0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
19ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19f00 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19f10 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19f20 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19f30 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
19f40 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19f50 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19f60 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
19f70 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
19f80 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19f90 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
19fa0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
19fb0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
19fc0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
19fd0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
19fe0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19ff0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1a000 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a010 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1a020 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a030 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1a040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a050 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a060 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1a070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a090 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1a0a0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1a0b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a0d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1a0e0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1a0f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a100 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a110 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1a120 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1a130 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1a140 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a150 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1a160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a170 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a180 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1a190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a1a0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a1b0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1a1c0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1a1d0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a1e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a1f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a200 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1a210 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a220 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1a230 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1a240 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a250 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1a260 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1a270 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a280 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1a290 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a2a0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1a2b0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1a2c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a2d0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1a2e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1a2f0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1a300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a310 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a320 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a330 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a350 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a360 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
1a370 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a380 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a390 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1a3a0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a3b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1a3c0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a3d0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1a3e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a3f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1a400 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1a410 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1a420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a430 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a440 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1a450 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1a460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a470 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a480 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1a490 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a4a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a4b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a4c0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
1a4d0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1a4e0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1a4f0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1a500 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1a510 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a520 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
1a530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a540 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a550 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1a560 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a570 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a580 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a590 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1a5a0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1a5b0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1a5c0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1a5d0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1a5e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a5f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1a600 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1a610 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a620 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1a630 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1a640 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1a650 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1a660 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a670 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1a680 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1a690 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1a6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a6c0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1a6d0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1a6e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a6f0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1a700 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a710 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1a720 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1a730 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1a740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a750 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1a760 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1a770 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1a780 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1a790 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a7a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a7b0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1a7c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
1a7d0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
1a7e0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1a7f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a800 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
1a810 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
1a820 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
1a830 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
1a840 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
1a850 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
1a860 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1a870 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
1a880 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
1a890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
1a8a0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1a8b0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1a8c0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1a8d0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1a8e0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1a8f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1a900 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1a910 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a920 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1a930 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1a940 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1a950 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1a960 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1a970 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1a980 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1a990 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1a9a0 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1a9b0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1a9c0 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
1a9d0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
1a9e0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
1a9f0 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
1aa00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1aa10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1aa20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aa30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1aa40 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1aa50 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1aa60 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1aa70 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1aa80 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1aa90 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
1aaa0 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1aab0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1aac0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1aad0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
1aae0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
1aaf0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
1ab00 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1ab10 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1ab20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1ab30 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1ab40 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1ab50 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1ab60 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1ab70 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1ab80 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1ab90 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1aba0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1abb0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1abc0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1abd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1abe0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1abf0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1ac00 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1ac10 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1ac20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1ac30 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1ac40 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1ac50 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1ac60 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1ac70 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1ac80 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ac90 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1aca0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1acb0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1acc0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1acd0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1ace0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1acf0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1ad00 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1ad10 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1ad20 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1ad30 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1ad40 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1ad50 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1ad60 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1ad70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1ad80 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1ad90 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1ada0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1adb0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1adc0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1add0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1ade0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1adf0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1ae00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ae10 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1ae20 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1ae30 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1ae40 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1ae50 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1ae60 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1ae70 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1ae80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1ae90 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1aea0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1aeb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1aec0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1aed0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1aee0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1aef0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1af00 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1af10 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1af20 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1af30 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1af40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1af50 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1af60 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1af70 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1af80 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1af90 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1afa0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1afb0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1afc0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1afd0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1afe0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1aff0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b000 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b010 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b020 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b030 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b040 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b050 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b060 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b070 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b080 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b090 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b0a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b0b0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b0c0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b0d0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b0e0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1b0f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1b100 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1b110 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1b120 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b130 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b140 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1b150 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1b160 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1b170 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1b180 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1b190 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1b1a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1b1b0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1b1c0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1b1d0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1b1e0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1b1f0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b200 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1b210 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1b220 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1b230 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b240 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1b250 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b260 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1b270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b280 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b290 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1b2a0 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1b2b0 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1b2c0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1b2d0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1b2e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1b2f0 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1b300 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b310 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1b320 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1b330 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1b340 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1b350 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1b360 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1b370 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1b380 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b390 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1b3a0 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1b3b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b3c0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b3d0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b3e0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b3f0 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b400 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b420 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1b430 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b440 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1b450 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1b460 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b470 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b480 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b490 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b4a0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1b4b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b4c0 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1b4d0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1b4e0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1b4f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1b500 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b510 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1b520 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b530 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1b540 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1b550 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b560 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1b570 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1b580 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1b590 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1b5a0 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1b5b0 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1b5c0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1b5d0 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1b5e0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1b5f0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1b600 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1b610 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1b620 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1b630 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b640 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1b650 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1b660 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b670 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b680 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b690 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b6a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b6b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b6c0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1b6d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1b6e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b6f0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1b700 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1b710 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1b720 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1b730 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1b740 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1b750 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1b760 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1b770 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1b780 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1b790 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1b7a0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1b7b0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1b7c0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1b7d0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1b7e0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1b7f0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1b800 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1b810 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1b820 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1b830 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1b840 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1b850 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1b860 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1b870 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1b880 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1b890 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1b8a0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1b8b0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1b8c0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1b8d0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1b8e0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1b8f0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1b900 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1b910 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1b920 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1b930 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1b940 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1b950 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1b960 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1b970 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b980 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1b990 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1b9a0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1b9b0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1b9c0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1b9d0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1b9e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1b9f0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1ba00 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1ba10 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1ba20 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1ba30 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1ba40 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1ba50 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1ba60 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1ba70 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1ba80 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1ba90 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1baa0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1bab0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1bac0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1bad0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1bae0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1baf0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1bb00 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1bb10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bb20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1bb30 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1bb40 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1bb50 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1bb60 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1bb70 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1bb80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bb90 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1bba0 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1bbb0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bbc0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1bbd0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1bbe0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1bbf0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1bc00 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1bc10 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1bc20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1bc30 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1bc40 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1bc50 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1bc60 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1bc70 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1bc80 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1bc90 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1bca0 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1bcb0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1bcc0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1bcd0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1bce0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1bcf0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1bd00 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1bd10 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1bd20 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1bd30 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1bd40 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1bd50 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1bd60 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1bd70 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1bd80 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1bd90 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1bda0 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1bdb0 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1bdc0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1bdd0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1bde0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1bdf0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1be00 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1be10 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1be20 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1be30 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1be40 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1be50 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1be60 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1be70 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1be80 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1be90 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1bea0 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1beb0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1bec0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1bed0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1bee0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1bef0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1bf00 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1bf10 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1bf20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1bf30 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1bf40 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1bf50 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1bf60 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1bf70 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1bf80 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1bf90 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1bfa0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1bfb0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1bfc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bfd0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1bfe0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1bff0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c000 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c010 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c020 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c030 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c040 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c050 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c060 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c070 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c080 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c090 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c0a0 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c0b0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c0c0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c0d0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c0e0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c0f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c100 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c110 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c120 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64  ery .**        d
1c130 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c140 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  T.".**.**  (11) 
1c150 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1c160 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1c170 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
1c180 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1c190 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1c1a0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1c1b0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1c1c0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1c1d0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1c1e0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1c1f0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1c200 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1c210 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1c220 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1c230 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1c240 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1c250 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1c260 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1c270 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c280 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1c290 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
1c2a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1c2b0 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
1c2c0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
1c2d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
1c2e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c2f0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
1c300 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
1c310 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
1c320 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
1c330 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
1c340 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
1c350 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1c360 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1c370 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c380 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
1c390 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
1c3a0 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1c3b0 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1c3c0 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1c3d0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1c3e0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1c3f0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1c400 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1c410 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
1c420 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
1c430 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
1c440 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
1c450 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
1c460 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
1c470 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
1c480 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1c490 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
1c4a0 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
1c4b0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1c4c0 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c4d0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
1c4e0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c4f0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
1c500 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c510 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
1c520 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
1c530 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c540 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  a join.**.**    
1c550 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
1c560 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
1c570 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
1c580 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
1c590 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
1c5a0 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
1c5b0 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
1c5c0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
1c5d0 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
1c5e0 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
1c5f0 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  ET clauses.  The
1c600 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74   subquery cannot
1c610 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   use any compoun
1c620 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1c630 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
1c640 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73  UNION ALL becaus
1c650 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
1c660 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1c670 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76     operators hav
1c680 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53  e an implied DIS
1c690 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64  TINCT which is d
1c6a0 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20  isallowed by.** 
1c6b0 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69         restricti
1c6c0 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  on (4)..**.**   
1c6d0 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20       Also, each 
1c6e0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65  component of the
1c6f0 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20   sub-query must 
1c700 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1c710 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
1c720 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
1c730 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75  ns. This is actu
1c740 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65  ally a requireme
1c750 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f  nt for any compo
1c760 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45  und.**        SE
1c770 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1c780 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65  but all the code
1c790 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61   here does is ma
1c7a0 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a  ke sure that no.
1c7b0 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28  **        such (
1c7c0 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65  illegal) sub-que
1c7d0 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e  ry is flattened.
1c7e0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1c7f0 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20   detect the.**  
1c800 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72        syntax err
1c810 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  or and return a 
1c820 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65  detailed message
1c830 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
1c840 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1c850 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1c860 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
1c870 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
1c880 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
1c890 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
1c8a0 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
1c8b0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
1c8c0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
1c8d0 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
1c8e0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
1c8f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c900 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c910 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c920 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1c930 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1c940 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1c950 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1c960 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1c970 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c980 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1c990 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1c9a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1c9b0 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1c9c0 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1c9d0 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1c9e0 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1c9f0 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1ca00 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1ca10 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1ca20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1ca30 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1ca40 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1ca50 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1ca60 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1ca70 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1ca80 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1ca90 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1caa0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1cab0 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1cac0 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (21)  The subque
1cad0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cae0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1caf0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1cb00 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1cb10 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1cb20 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1cb30 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1cb40 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cb50 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cb60 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54  ..**.**  (23)  T
1cb70 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74  he parent is not
1cb80 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1cb90 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65  , or the sub-que
1cba0 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20  ry is not a.**  
1cbb0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71        compound q
1cbc0 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72  uery. This restr
1cbd0 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1cbe0 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1cbf0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1cc00 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1cc10 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1cc20 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1cc30 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1cc40 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1cc50 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1cc60 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29  t()..**.**  (24)
1cc70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cc80 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1cc90 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65  te that uses the
1cca0 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20   built-in min() 
1ccb0 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72  or .**        or
1ccc0 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73   max() functions
1ccd0 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73  .  (Without this
1cce0 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20   restriction, a 
1ccf0 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20  query like:.**  
1cd00 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20        "SELECT x 
1cd10 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78  FROM (SELECT max
1cd20 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22  (y), x FROM t1)"
1cd30 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73   would not neces
1cd40 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20  sarily.**       
1cd50 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
1cd60 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20  e X for which Y 
1cd70 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a  was maximal.).**
1cd80 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1cd90 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1cda0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1cdb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1cdc0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1cdd0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1cde0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1cdf0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1ce00 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1ce10 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1ce20 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1ce30 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1ce40 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1ce50 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1ce60 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1ce70 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1ce80 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1ce90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1cea0 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1ceb0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1cec0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1ced0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1cee0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1cef0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1cf00 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1cf10 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1cf20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1cf30 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1cf40 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1cf50 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1cf60 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1cf70 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1cf80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cf90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1cfa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1cfb0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1cfc0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1cfd0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1cfe0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1cff0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1d000 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1d010 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1d020 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1d030 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1d040 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d050 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1d060 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1d070 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1d080 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1d090 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d0a0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d0b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1d0c0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1d0d0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1d0e0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1d0f0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1d100 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1d110 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
1d120 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1d130 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1d140 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1d150 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1d160 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d170 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1d180 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1d190 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1d1a0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1d1b0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1d1c0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1d1d0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d1e0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1d1f0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d200 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1d220 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1d230 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1d240 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1d250 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1d260 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1d270 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1d280 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1d290 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1d2a0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1d2b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d2c0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1d2d0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d2f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d300 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1d310 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1d320 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1d330 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1d340 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d350 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1d360 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1d370 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d380 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1d390 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1d3a0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1d3b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1d3c0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1d3d0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1d3e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1d3f0 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1d400 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1d410 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1d420 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1d430 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1d440 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d450 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1d460 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1d470 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1d480 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1d490 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1d4a0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1d4b0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1d4c0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1d4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d4e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62  !=0 );.  if( sub
1d4f0 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1d500 20 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65    if( isAgg ) re
1d510 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d540 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20  ction (1)   */. 
1d550 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
1d560 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d590 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a  iction (2a)  */.
1d5a0 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65      if( (p->pWhe
1d5b0 72 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  re && ExprHasPro
1d5c0 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c  perty(p->pWhere,
1d5d0 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20  EP_Subquery)).  
1d5e0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1d5f0 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1d600 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71  EList) & EP_Subq
1d610 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c  uery)!=0.     ||
1d620 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   (sqlite3ExprLis
1d630 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72  tFlags(p->pOrder
1d640 42 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  By) & EP_Subquer
1d650 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  y)!=0.    ){.   
1d660 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d6a0 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20  tion (2b)  */.  
1d6b0 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70    }.  }.    .  p
1d6c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d6d0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d6e0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
1d6f0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
1d700 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
1d710 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
1d720 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
1d730 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
1d740 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
1d750 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
1d760 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1d770 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1d780 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d790 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1d7a0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1d7b0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1d7c0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1d7d0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1d7e0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1d7f0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1d800 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1d810 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1d820 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1d830 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1d840 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1d850 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d870 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1d880 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1d890 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1d8a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d8c0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1d8d0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1d8e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1d8f0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1d900 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1d910 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d950 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1d960 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1d970 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1d980 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d990 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d9a0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1d9b0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1d9c0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d9d0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1d9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d9f0 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1da00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1da10 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1da20 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1da30 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1da40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1da50 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1da60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1da70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1da80 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1da90 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1daa0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1dab0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1dac0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1dad0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1dae0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1daf0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1db00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1db40 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1db50 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1db60 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1db70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1db80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1db90 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1dba0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dbb0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1dbc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dbd0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dbe0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1dbf0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1dc00 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1dc10 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1dc20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1dc30 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1dc40 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1dc50 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
1dc60 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1dc70 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1dc80 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1dc90 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1dca0 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
1dcb0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1dcc0 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
1dcd0 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67  sive|SF_MinMaxAg
1dce0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
1dcf0 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69   0; /* Restricti
1dd00 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34  ons (22) and (24
1dd10 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1dd20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dd30 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
1dd40 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1dd50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1dd60 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  Restriction (23)
1dd70 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42   */.  }..  /* OB
1dd80 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1dd90 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1dda0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1ddb0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1ddc0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1ddd0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1dde0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1ddf0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1de00 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1de10 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1de20 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1de30 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1de40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1de50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1de60 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1de70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1de80 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1de90 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1dea0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1deb0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1dec0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1ded0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1dee0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1def0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1df00 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1df10 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1df20 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1df30 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1df40 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1df50 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1df60 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1df70 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1df80 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1df90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1dfa0 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1dfb0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1dfc0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1dfd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1dfe0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1dff0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1e000 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1e010 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1e020 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1e030 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1e040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1e050 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1e060 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1e070 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1e080 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1e090 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1e0a0 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1e0b0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1e0c0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1e0d0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1e0e0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1e0f0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1e100 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1e110 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1e120 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1e130 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1e140 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1e150 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1e160 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1e170 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1e180 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1e190 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1e1a0 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1e1b0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1e1c0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e1d0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1e1e0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1e1f0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1e200 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1e210 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1e220 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1e230 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1e240 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1e250 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1e260 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1e270 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e280 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1e290 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1e2a0 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1e2b0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1e2c0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1e2d0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1e2e0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1e2f0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1e300 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1e310 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1e320 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1e330 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1e340 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1e350 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1e360 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1e370 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e380 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1e390 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1e3a0 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1e3b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1e3c0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1e3d0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1e3e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e3f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1e400 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1e410 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1e420 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1e430 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1e440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1e450 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1e460 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1e470 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1e480 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1e490 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1e4a0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1e4b0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1e4c0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1e4d0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1e4e0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1e4f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e500 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e510 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e520 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1e530 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1e540 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1e550 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1e560 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1e570 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1e580 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1e590 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1e5a0 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1e5b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1e5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1e5d0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1e5e0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1e5f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1e600 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1e610 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1e620 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1e630 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1e640 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1e650 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1e660 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1e670 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1e680 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1e690 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1e6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e6b0 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1e6c0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1e6d0 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1e6e0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1e6f0 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
1e700 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
1e710 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
1e720 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
1e750 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
1e760 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
1e770 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
1e780 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
1e790 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
1e7a0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
1e7b0 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
1e7c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e7d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1e7e0 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
1e7f0 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
1e800 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
1e810 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1e820 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1e830 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
1e840 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e850 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1e860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1e870 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
1e880 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
1e890 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
1e8a0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
1e8b0 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1e8c0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
1e8d0 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
1e8e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1e8f0 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
1e900 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
1e910 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
1e920 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
1e930 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
1e940 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1e950 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
1e960 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
1e970 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
1e980 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
1e990 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
1e9a0 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1e9b0 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1e9c0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1e9d0 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1e9e0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1e9f0 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1ea00 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1ea10 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1ea20 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1ea30 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1ea40 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1ea50 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1ea60 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1ea70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1ea80 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1ea90 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1eaa0 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1eab0 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1eac0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1ead0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1eae0 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1eaf0 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1eb00 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1eb10 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1eb20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1eb30 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1eb40 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1eb50 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1eb60 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1eb70 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1eb80 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1eb90 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1eba0 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1ebb0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1ebc0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ebd0 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1ebe0 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1ebf0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ec00 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1ec10 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1ec20 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1ec30 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1ec40 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1ec50 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1ec60 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1ec70 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1ec80 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1ec90 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1eca0 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1ecb0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1ecc0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1ecd0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1ece0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1ecf0 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1ed00 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1ed10 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1ed20 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1ed30 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1ed40 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1ed50 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1ed60 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1ed70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1ed80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1ed90 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1eda0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1edb0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1edc0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1edd0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
1ede0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
1edf0 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
1ee00 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
1ee10 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1ee20 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1ee30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1ee40 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1ee50 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1ee60 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1ee70 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1ee80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1ee90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
1eea0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1eeb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1eec0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
1eed0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
1eee0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
1eef0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1ef00 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1ef10 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
1ef20 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
1ef30 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
1ef40 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
1ef50 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73      ("compound-s
1ef60 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65  ubquery flattene
1ef70 72 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  r creates %s.%p 
1ef80 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20  as peer\n",.    
1ef90 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e       pNew->zSelN
1efa0 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20  ame, pNew));.   
1efb0 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
1efc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1efd0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1efe0 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
1eff0 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
1f000 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1f010 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
1f020 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f030 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
1f040 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
1f050 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
1f060 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
1f070 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1f080 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1f090 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1f0a0 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
1f0b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f0c0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
1f0d0 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
1f0e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1f0f0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
1f100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f110 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
1f120 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
1f130 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
1f140 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
1f150 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1f160 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
1f170 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1f180 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
1f190 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
1f1a0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
1f1b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1f1c0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f1d0 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
1f1e0 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
1f1f0 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
1f200 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
1f210 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
1f220 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
1f230 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
1f240 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
1f250 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
1f260 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
1f270 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
1f280 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
1f290 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
1f2a0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
1f2b0 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
1f2c0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1f2d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
1f2e0 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
1f2f0 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
1f300 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
1f310 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
1f320 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
1f330 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1f340 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1f350 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1f360 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
1f370 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
1f380 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1f390 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
1f3a0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f3b0 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
1f3c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f3d0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
1f3e0 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
1f3f0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1f400 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
1f410 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
1f420 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1f430 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
1f440 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
1f450 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
1f460 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1f470 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
1f480 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
1f490 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
1f4a0 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
1f4b0 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
1f4c0 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
1f4d0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1f4e0 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
1f4f0 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
1f500 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
1f510 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
1f520 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
1f530 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1f540 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1f550 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
1f560 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f570 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1f580 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1f590 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
1f5a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1f5b0 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
1f5c0 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
1f5d0 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
1f5e0 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1f5f0 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1f600 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
1f610 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
1f620 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
1f630 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
1f640 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
1f650 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
1f660 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
1f670 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
1f680 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
1f690 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
1f6a0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1f6b0 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
1f6c0 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
1f6d0 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
1f6e0 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
1f6f0 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
1f700 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
1f710 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
1f720 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
1f730 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
1f740 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
1f750 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1f760 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1f770 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
1f780 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
1f790 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
1f7a0 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
1f7b0 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
1f7c0 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
1f7d0 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
1f7e0 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
1f7f0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1f800 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1f810 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
1f820 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
1f830 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
1f840 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
1f850 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
1f860 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
1f870 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
1f880 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
1f890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f8a0 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1f8b0 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1f8c0 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1f8d0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1f8e0 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1f8f0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1f900 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f910 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1f920 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1f930 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1f940 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1f950 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1f960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f970 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f980 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1f990 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1f9a0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1f9b0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1f9c0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1f9d0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1f9e0 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1f9f0 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1fa00 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1fa10 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1fa20 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1fa30 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1fa40 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1fa50 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1fa60 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1fa70 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1fa80 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1fa90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1faa0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1fab0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1fac0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1fad0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1fae0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1faf0 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1fb00 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1fb10 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1fb20 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1fb30 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1fb40 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1fb50 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1fb60 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1fb70 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1fb80 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1fb90 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
1fba0 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
1fbb0 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
1fbc0 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
1fbd0 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
1fbe0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1fbf0 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
1fc00 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
1fc10 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fc20 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1fc30 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
1fc40 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
1fc50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1fc60 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1fc70 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1fc80 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
1fc90 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
1fca0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1fcb0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
1fcc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fcd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
1fce0 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
1fcf0 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
1fd00 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1fd10 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
1fd20 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
1fd30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1fd40 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
1fd50 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
1fd60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
1fd70 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
1fd80 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
1fd90 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1fda0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1fdb0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1fdc0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1fdd0 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1fde0 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1fdf0 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1fe00 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
1fe10 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
1fe20 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
1fe30 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
1fe40 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
1fe50 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
1fe60 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
1fe70 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
1fe80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1fe90 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
1fea0 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1feb0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
1fec0 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
1fed0 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
1fee0 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
1fef0 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1ff00 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1ff20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1ff30 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1ff40 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1ff50 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1ff60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1ff70 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1ff80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ff90 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1ffa0 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1ffb0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1ffc0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1ffd0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1ffe0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1fff0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
20000 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
20010 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
20020 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
20030 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
20040 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
20050 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
20060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20070 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
20080 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
20090 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
200a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
200b0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
200c0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
200d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
200e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
200f0 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
20100 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
20110 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
20120 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
20130 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
20140 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
20150 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
20160 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20170 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
20180 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
20190 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
201a0 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
201b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
201c0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
201d0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
201e0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
201f0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
20200 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
20210 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
20220 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
20230 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  erBy ){.      /*
20240 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
20250 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72  any non-zero iOr
20260 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20  derByCol values 
20270 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
20280 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
20290 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65   BY column expre
202a0 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63  ssion is identic
202b0 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72  al to the iOrder
202c0 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a  ByCol'th.      *
202d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  * expression ret
202e0 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
202f0 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20  statement pSub. 
20300 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75  Since these valu
20310 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e  es.      ** do n
20320 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
20330 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c  orrespond to col
20340 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73  umns in SELECT s
20350 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74  tatement pParent
20360 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  ,.      ** zero 
20370 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e  them before tran
20380 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45  sfering the ORDE
20390 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
203a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
203b0 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61  ot doing this ma
203c0 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  y cause an error
203d0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
203e0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
203f0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
20400 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
20410 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  ten a compound s
20420 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50  ub-query into pP
20430 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  arent.      ** (
20440 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69  the only way thi
20450 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20  s can happen is 
20460 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  if the compound 
20470 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20  sub-query is.   
20480 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
20490 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53  part of pSub->pS
204a0 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20  rc). See ticket 
204b0 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a  [d11a6e908f].  *
204c0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
204d0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75   *pOrderBy = pSu
204e0 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
204f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
20500 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
20510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  ++){.        pOr
20520 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
20530 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
20540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
20550 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20560 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
20570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
20580 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
20590 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
205a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
205b0 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
205c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
205d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
205e0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
205f0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
20600 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20610 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
20620 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20630 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
20640 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
20650 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
20660 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
20670 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
20680 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
20690 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
206a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
206b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
206c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
206d0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
206e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
206f0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
20700 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
20710 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20720 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
20730 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20740 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
20750 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
20760 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
20770 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20780 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20790 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
207a0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
207b0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
207c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
207f0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
20800 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
20810 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
20820 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
20830 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20840 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
20850 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
20860 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
20870 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
20880 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20890 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
208a0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
208b0 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
208c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
208d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
208e0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
208f0 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
20900 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
20910 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
20920 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
20930 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
20940 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
20950 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
20960 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
20970 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
20980 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
20990 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
209a0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
209b0 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
209c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
209d0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
209e0 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
209f0 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
20a00 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
20a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
20a20 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
20a30 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
20a40 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
20a50 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
20a60 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
20a70 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
20a80 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
20a90 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
20aa0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
20ab0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
20ac0 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
20ad0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
20ae0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
20af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
20b00 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
20b10 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
20b20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
20b30 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
20b40 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
20b50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
20b60 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
20b70 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
20b80 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
20b90 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
20ba0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
20bb0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
20bc0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
20bd0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
20be0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
20bf0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
20c00 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
20c10 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
20c20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
20c30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20c40 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
20c50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20c60 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a  OMIT_VIEW) */...
20c70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
20c80 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20c90 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
20ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
20cb0 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
20cc0 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
20cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
20ce0 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
20cf0 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
20d00 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
20d10 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
20d20 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
20d30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
20d40 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
20d50 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
20d60 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
20d70 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
20d80 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
20d90 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
20da0 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
20db0 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
20dc0 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
20dd0 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
20de0 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
20df0 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
20e00 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
20e10 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
20e20 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
20e30 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
20e40 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
20e50 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
20e60 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
20e70 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
20e80 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (1) The inner q
20e90 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
20ea0 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74 20  gate.  (In that 
20eb0 63 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c 6c  case, we'd reall
20ec0 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20 20  y want.**       
20ed0 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74 65  to copy the oute
20ee0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  r WHERE-clause t
20ef0 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48 41  erms onto the HA
20f00 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  VING clause of t
20f10 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e 65  he.**       inne
20f20 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 74 68  r query.  But th
20f30 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e 27  ey probably won'
20f40 74 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f 20  t help there so 
20f50 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29 0a  do not bother.).
20f60 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20  **.**   (2) The 
20f70 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
20f80 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72  he recursive par
20f90 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61  t of a common ta
20fa0 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ble expression..
20fb0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20  **.**   (3) The 
20fc0 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20  inner query has 
20fd0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28  a LIMIT clause (
20fe0 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65  since the change
20ff0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  s to the WHERE.*
21000 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f  *       close wo
21010 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d  uld change the m
21020 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49  eaning of the LI
21030 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  MIT)..**.**   (4
21040 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
21050 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
21060 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
21070 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c   JOIN.  (The cal
21080 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66  ler.**       enf
21090 6f 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72  orces this restr
210a0 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69  iction since thi
210b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
210c0 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a  ot have enough.*
210d0 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74  *       informat
210e0 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a  ion to know.).**
210f0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
21100 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
21110 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
21120 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
21130 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
21140 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
21150 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
21160 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
21170 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
21180 65 72 65 54 65 72 6d 73 28 0a 20 20 73 71 6c 69  ereTerms(.  sqli
21190 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
211a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
211b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 66 6f  e connection (fo
211c0 72 20 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f 0a 20  r malloc()) */. 
211d0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
211e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
211f0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
21200 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
21210 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
21220 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
21230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
21240 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
21250 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
21260 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20  /.  int iCursor 
21270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
21280 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
21290 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  e subquery */.){
212a0 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
212b0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
212c0 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
212d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
212e0 28 20 28 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61  ( (pSubq->selFla
212f0 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61  gs & (SF_Aggrega
21300 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29  te|SF_Recursive)
21310 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
21320 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
21330 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28  ctions (1) and (
21340 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  2) */.  }.  if( 
21350 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
21360 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
21370 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
21380 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
21390 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
213a0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
213b0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
213c0 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62 2c 20  nWhereTerms(db, 
213d0 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
213e0 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b  Right, iCursor);
213f0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
21400 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
21410 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
21420 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
21430 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
21440 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
21450 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
21460 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ubq ){.      pNe
21470 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
21480 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 30  up(db, pWhere, 0
21490 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
214a0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4e  substExpr(db, pN
214b0 65 77 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75  ew, iCursor, pSu
214c0 62 71 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  bq->pEList);.   
214d0 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
214e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
214f0 64 28 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  d(db, pSubq->pWh
21500 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
21510 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
21520 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
21530 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
21540 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
21550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21560 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
21570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21580 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
21590 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74  /*.** Based on t
215a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
215b0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
215c0 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
215d0 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
215e0 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
215f0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
21600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21610 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
21620 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f    * the query co
21630 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69  ntains just a si
21640 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  ngle aggregate f
21650 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a  unction,.**    *
21660 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
21670 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65  unction is eithe
21680 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  r min() or max()
21690 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68  , and.**    * th
216a0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
216b0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
216c0 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  tion is a column
216d0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
216e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
216f0 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  e are true, then
21700 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21710 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
21720 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65  RBY_MAX.** is re
21730 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70  turned as approp
21740 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70  riate. Also, *pp
21750 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
21760 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a   point to the .*
21770 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  * list of argume
21780 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
21790 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f  e aggregate befo
217a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
217b0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63  .** Or, if the c
217c0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
217d0 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70  are not met, *pp
217e0 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
217f0 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f   0 and.** WHERE_
21800 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69  ORDERBY_NORMAL i
21810 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
21820 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
21830 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41  uery(AggInfo *pA
21840 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74  ggInfo, ExprList
21850 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
21860 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
21870 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
21880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21890 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
218a0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20  *ppMinMax = 0;. 
218b0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
218c0 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45  Func==1 ){.    E
218d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67  xpr *pExpr = pAg
218e0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
218f0 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67  pExpr; /* Aggreg
21900 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
21910 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
21920 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
21930 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41  pList;      /* A
21940 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
21950 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  function */..   
21960 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21970 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
21980 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ION );.    if( p
21990 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
219a0 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c  >nExpr==1 && pEL
219b0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
219c0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
219d0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  MN ){.      cons
219e0 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20  t char *zFunc = 
219f0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
21a00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
21a10 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
21a20 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
21a30 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
21a40 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
21a50 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
21a60 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
21a70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
21a80 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
21a90 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
21aa0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
21ab0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
21ac0 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
21ad0 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
21ae0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
21af0 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
21b00 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69  Max==0 || (*ppMi
21b10 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20  nMax)->nExpr==1 
21b20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  );.  return eRet
21b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
21b40 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
21b50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
21b60 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
21b70 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
21b80 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
21b90 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
21ba0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
21bb0 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
21bc0 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
21bd0 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
21be0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
21bf0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
21c00 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
21c10 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
21c20 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
21c30 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
21c40 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
21c50 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
21c60 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
21c70 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
21c80 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
21c90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
21ca0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
21cb0 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
21cc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
21cd0 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
21ce0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21cf0 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
21d00 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
21d10 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
21d20 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
21d30 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
21d40 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
21d50 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
21d60 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
21d70 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
21d80 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
21d90 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
21da0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
21db0 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
21dc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
21dd0 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
21de0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
21df0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
21e00 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
21e10 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
21e20 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
21e30 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
21e40 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
21e50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
21e60 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
21e70 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
21e80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
21e90 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
21ea0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
21eb0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
21ec0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
21ed0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
21ee0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
21ef0 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
21f00 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
21f10 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
21f20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
21f30 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
21f40 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
21f50 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
21f60 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
21f70 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
21f80 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
21f90 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
21fa0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
21fb0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
21fc0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
21fd0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
21fe0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
21ff0 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
22000 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
22010 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
22020 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
22030 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
22040 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
22050 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
22060 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
22070 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
22080 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
22090 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
220a0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
220b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
220c0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
220d0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
220e0 6d 2d 3e 7a 49 6e 64 65 78 65 64 42 79 20 29 7b  m->zIndexedBy ){
220f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
22100 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
22110 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
22120 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  edBy = pFrom->zI
22130 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e  ndexedBy;.    In
22140 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
22150 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
22160 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
22170 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
22180 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
22190 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20  e, zIndexedBy); 
221a0 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
221b0 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
221c0 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
221d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
221e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
221f0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
22200 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c  %s", zIndexedBy,
22210 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
22220 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
22230 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
22240 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22250 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
22260 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
22270 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22280 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
22290 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
222a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
222b0 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
222c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
222d0 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
222e0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
222f0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
22300 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
22310 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
22320 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
22330 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
22340 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
22350 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
22360 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
22370 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22380 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
22390 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
223a0 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
223b0 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
223c0 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
223d0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
223e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
223f0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
22400 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
22410 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
22420 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
22430 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
22440 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
22450 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
22460 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
22470 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
22480 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
22490 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
224a0 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
224b0 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
224c0 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
224d0 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
224e0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
224f0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
22500 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
22510 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
22520 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
22530 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
22540 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
22550 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
22560 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
22570 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
22580 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
22590 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
225a0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
225b0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
225c0 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
225d0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
225e0 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
225f0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
22600 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
22610 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
22620 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
22630 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
22640 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
22650 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
22660 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
22670 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
22680 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
22690 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
226a0 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
226b0 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
226c0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
226d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
226e0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
226f0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
22700 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
22710 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
22720 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
22730 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
22740 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
22750 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
22760 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
22770 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
22780 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
22790 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
227a0 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
227b0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
227c0 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
227d0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
227e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
227f0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
22800 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
22810 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
22820 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
22830 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
22840 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
22850 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
22860 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22870 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
22880 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
22890 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
228a0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
228b0 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
228c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
228d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
228e0 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
228f0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
22900 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
22910 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
22920 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
22930 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
22940 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
22950 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
22960 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22970 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
22980 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
22990 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
229a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
229b0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
229c0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
229d0 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20  , TK_ALL, 0));. 
229e0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
229f0 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
22a00 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
22a10 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
22a20 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
22a30 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
22a40 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
22a50 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
22a60 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
22a70 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
22a80 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
22a90 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
22aa0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22ab0 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
22ac0 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
22ad0 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
22ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
22af0 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
22b00 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
22b10 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
22b20 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
22b30 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
22b40 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
22b50 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22b60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22b70 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
22b80 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
22b90 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
22ba0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
22bb0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
22bc0 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
22bd0 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
22be0 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
22bf0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
22c00 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
22c10 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
22c20 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
22c30 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
22c40 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
22c50 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
22c60 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22c70 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
22c80 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
22c90 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
22ca0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
22cb0 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
22cc0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
22cd0 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
22ce0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
22cf0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
22d00 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
22d10 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
22d20 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
22d30 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
22d40 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
22d50 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
22d60 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
22d70 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48  t outermost WITH
22d80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
22d90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22da0 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
22db0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
22dc0 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
22dd0 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
22de0 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
22df0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
22e00 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
22e10 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
22e20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
22e30 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
22e40 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
22e50 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
22e60 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
22e70 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
22e80 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
22e90 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
22ea0 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
22eb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22ec0 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
22ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
22ee0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
22ef0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
22f00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22f10 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
22f20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
22f30 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
22f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22f50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22f60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
22f70 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
22f80 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
22f90 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
22fa0 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
22fb0 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
22fc0 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
22fd0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
22fe0 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
22ff0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
23000 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
23010 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
23020 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23030 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
23040 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
23050 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
23060 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
23070 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
23080 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
23090 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
230a0 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
230b0 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
230c0 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
230d0 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
230e0 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
230f0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
23100 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
23110 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
23120 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
23130 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
23140 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
23150 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
23160 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
23170 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
23180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23190 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
231a0 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
231b0 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50  ( bFree==0 || pP
231c0 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29  arse->pWith==0 )
231d0 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
231e0 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
231f0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
23200 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
23210 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
23220 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65     pParse->bFree
23230 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20  With = bFree;.  
23240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
23250 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
23260 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
23270 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
23280 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
23290 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
232a0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
232b0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
232c0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
232d0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
232e0 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
232f0 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
23300 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
23310 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
23320 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
23330 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
23340 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
23350 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
23360 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
23370 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
23380 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
23390 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
233a0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
233b0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
233c0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
233d0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
233e0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
233f0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
23400 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
23410 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
23420 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
23430 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
23440 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
23450 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
23460 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
23470 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
23480 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
23490 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
234a0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
234b0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
234c0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
234d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
234e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
234f0 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
23500 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
23510 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
23520 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
23530 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
23540 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
23550 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
23560 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23570 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
23580 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
23590 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
235a0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
235b0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
235c0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
235e0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
235f0 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
23600 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
23610 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23620 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
23630 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
23640 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
23650 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
23660 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
23670 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
23680 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
23690 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
236a0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
236d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
236e0 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
236f0 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
23700 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
23710 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
23720 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
23730 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
23740 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
23750 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
23760 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
23770 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
23780 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20  f pCte->zErr is 
23790 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
237a0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
237b0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
237c0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
237d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
237e0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
237f0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
23800 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
23810 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
23820 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c  e->zErr is NULL,
23830 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
23840 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
23850 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
23860 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
23870 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
23880 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b  f( pCte->zErr ){
23890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
238a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
238b0 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d  Cte->zErr, pCte-
238c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
238d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
238e0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  OR;.    }..    a
238f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
23900 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
23910 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23920 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23930 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
23940 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
23950 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23960 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23970 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23980 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
23990 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
239a0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
239b0 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
239c0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
239d0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
239e0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
239f0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
23a00 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
23a10 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23a20 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23a30 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
23a40 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
23a50 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23a60 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
23a70 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
23a80 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
23a90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23ab0 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
23ac0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
23ad0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
23ae0 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
23af0 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
23b00 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
23b10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
23b20 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
23b30 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
23b40 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
23b50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
23b60 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
23b70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
23b80 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
23b90 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
23ba0 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
23bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
23bc0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
23bd0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
23be0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
23bf0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
23c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
23c10 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
23c20 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
23c30 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
23c40 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
23c50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
23c60 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
23c70 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
23c80 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
23c90 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
23ca0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
23cb0 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
23cc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
23cd0 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
23ce0 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
23cf0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
23d00 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
23d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23d20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
23d30 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
23d40 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
23d50 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
23d60 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
23d70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23d80 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
23d90 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
23da0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
23db0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
23dc0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
23dd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
23de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23df0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
23e00 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
23e10 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
23e20 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
23e30 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
23e40 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
23e50 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63   pCte->zErr = "c
23e60 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
23e70 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
23e80 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
23e90 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
23ea0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
23eb0 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
23ec0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
23ed0 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
23ee0 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
23ef0 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72   pSel);..    for
23f00 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
23f10 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
23f20 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
23f30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
23f40 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
23f50 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
23f60 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
23f70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
23f80 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
23f90 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
23fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23fb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
23fc0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
23fd0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
23fe0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
23ff0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
24000 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
24010 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
24020 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
24030 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
24040 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
24050 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24060 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
24070 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
24080 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
24090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c  ;.    }..    sel
240a0 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
240b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
240c0 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
240d0 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
240e0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
240f0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
24100 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
24110 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
24120 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
24130 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74  te->zErr = "mult
24140 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
24150 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
24160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24170 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20       pCte->zErr 
24180 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
24190 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
241a0 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
241b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
241c0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
241d0 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
241e0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
241f0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
24200 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
24210 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
24220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24230 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
24240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24250 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
24260 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
24270 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
24280 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
24290 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
242a0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
242b0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
242c0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
242d0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
242e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
242f0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
24300 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
24310 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
24320 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
24330 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
24340 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
24350 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
24360 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
24370 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
24380 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
24390 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
243a0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
243b0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
243c0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
243d0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
243e0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
243f0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
24400 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
24410 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
24420 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
24430 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
24440 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
24450 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24460 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
24470 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
24480 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
24490 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
244a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
244b0 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
244c0 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
244d0 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
244e0 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
244f0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
24500 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
24510 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
24520 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
24530 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
24540 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
24550 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
24560 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
24570 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
24580 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
24590 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
245a0 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
245b0 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
245c0 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
245d0 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
245e0 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
245f0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
24600 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
24610 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
24620 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
24630 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
24640 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
24650 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
24660 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
24670 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
24680 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
24690 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
246a0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
246b0 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
246c0 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
246d0 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
246e0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
246f0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
24700 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
24710 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
24720 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
24730 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
24740 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
24750 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
24760 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
24770 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
24780 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
24790 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
247a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
247b0 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
247c0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
247d0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
247e0 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
247f0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
24800 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
24810 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
24820 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
24830 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
24840 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
24850 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
24860 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
24870 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
24880 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
24890 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
248a0 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
248b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
248c0 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
248d0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
248e0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
248f0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
24900 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
24910 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24920 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24930 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
24940 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
24950 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
24960 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
24970 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24980 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24990 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
249a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
249b0 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
249c0 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
249d0 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
249e0 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
249f0 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
24a00 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
24a10 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
24a20 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
24a30 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24a40 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
24a50 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
24a60 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
24a70 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
24a80 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
24a90 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
24aa0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24ab0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
24ac0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61  EList;.  if( pWa
24ad0 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c  lker->xSelectCal
24ae0 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f  lback2==selectPo
24af0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
24b00 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
24b10 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f  rse, findRightmo
24b20 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29  st(p)->pWith, 0)
24b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
24b40 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
24b50 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
24b60 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
24b70 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
24b80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
24b90 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24ba0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
24bb0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
24bc0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
24bd0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
24be0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
24bf0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
24c00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24c10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
24c20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
24c30 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
24c40 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
24c50 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
24c60 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
24c70 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
24c80 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
24c90 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
24ca0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
24cb0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
24cc0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
24cd0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
24ce0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
24cf0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
24d00 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
24d10 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
24d20 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
24d30 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20  pFrom->pTab );. 
24d40 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
24d50 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
24d60 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46  inue;.    if( pF
24d70 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
24d80 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
24d90 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
24da0 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
24db0 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
24dc0 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
24dd0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
24de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
24df0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
24e00 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
24e10 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74      selectPopWit
24e20 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23  h(pWalker, p);.#
24e30 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
24e40 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
24e50 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
24e60 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
24e70 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
24e80 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
24e90 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24ea0 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
24eb0 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
24ec0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
24ed0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
24ee0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
24ef0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
24f00 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
24f10 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
24f20 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
24f30 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
24f40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
24f50 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
24f60 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
24f70 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
24f80 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24f90 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
24fa0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24fb0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
24fc0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24fd0 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  rt;.      pFrom-
24fe0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
24ff0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
25000 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
25010 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
25020 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
25030 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25040 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
25050 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
25060 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
25070 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
25080 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
25090 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
250a0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
250b0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
250c0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
250d0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
250e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
250f0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
25100 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
25110 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
25120 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
25130 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
25140 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
25150 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
25160 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
25170 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
25180 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
25190 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
251a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
251b0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
251c0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
251d0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
251e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
251f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
25200 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
25210 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
25220 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
25230 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
25240 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
25250 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
25260 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
25270 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
25280 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d   if( pTab->nRef=
25290 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
252a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
252b0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
252c0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
252d0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
252e0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
252f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
25300 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
25310 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
25320 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
25330 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
25340 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
25350 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
25360 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
25370 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
25380 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
25390 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
253a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
253b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
253c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
253d0 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
253e0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
253f0 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
25400 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
25410 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
25420 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
25430 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
25440 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
25450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
25460 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
25470 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
25480 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
25490 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
254a0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
254b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
254c0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
254d0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
254e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
254f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25500 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25510 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
25520 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
25530 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
25540 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
25550 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
25560 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
25570 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
25580 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
25590 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
255a0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
255b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
255c0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
255d0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
255e0 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
255f0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
25600 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
25610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
25620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
25630 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
25640 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
25650 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
25660 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
25670 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
25680 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
25690 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
256a0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
256b0 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
256c0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
256d0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
256e0 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
256f0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
25700 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
25710 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
25720 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
25730 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
25740 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
25750 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
25760 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
25770 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
25780 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
25790 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
257a0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
257b0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
257c0 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
257d0 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
257e0 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
257f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
25800 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
25810 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
25820 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
25830 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
25840 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
25850 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
25860 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
25870 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
25880 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
25890 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
258a0 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
258b0 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
258c0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
258d0 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
258e0 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
258f0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
25900 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
25910 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25920 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
25930 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
25940 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
25950 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
25960 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
25970 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
25980 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
25990 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
259a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
259b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
259c0 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
259d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
259e0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
259f0 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
25a00 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
25a10 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
25a20 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
25a30 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
25a40 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
25a50 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
25a60 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
25a70 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
25a80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
25a90 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
25aa0 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
25ab0 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
25ac0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
25ad0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
25ae0 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
25af0 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
25b00 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
25b10 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
25b30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
25b40 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
25b50 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
25b60 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25b70 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
25b80 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
25b90 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
25ba0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
25bb0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25bc0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
25bd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
25be0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
25bf0 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
25c00 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
25c10 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
25c20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
25c30 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
25c40 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
25c50 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
25c60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25c70 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
25c80 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
25c90 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
25ca0 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
25cb0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
25cc0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
25cd0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
25ce0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
25cf0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
25d00 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
25d10 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
25d20 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
25d30 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
25d40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
25d50 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
25d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d70 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
25d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25d90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
25da0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
25db0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
25dc0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
25dd0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
25de0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
25df0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
25e00 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
25e10 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
25e20 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
25e30 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
25e40 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
25e50 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
25e60 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
25e70 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
25e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
25e90 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
25ea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
25eb0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
25ec0 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
25ed0 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
25ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
25ef0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
25f00 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
25f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
25f20 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
25f30 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
25f40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
25f50 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
25f60 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
25f70 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
25f80 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
25f90 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
25fa0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
25fb0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
25fc0 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
25fd0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
25fe0 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
25ff0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
26000 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
26010 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
26020 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
26030 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
26040 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
26050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26060 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
26070 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
26080 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26090 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
260a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
260b0 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
260c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
260d0 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
260e0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
260f0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
26100 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
26110 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
26120 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
26130 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26140 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
26150 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
26160 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
26170 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
26180 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
26190 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
261a0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
261b0 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
261c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
261d0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
261e0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
261f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
26200 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
26210 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
26220 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
26230 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
26240 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
26250 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
26260 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
26270 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
26280 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
26290 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
262a0 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
262b0 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
262c0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
262d0 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
262e0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
262f0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
26300 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26310 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
26320 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
26330 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
26340 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
26350 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
26360 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
26370 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
26380 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26390 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
263a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
263b0 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
263c0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
263d0 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
263e0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
263f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
26400 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
26410 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
26420 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
26430 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
26440 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
26450 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
26460 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26470 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
26480 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
26490 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
264a0 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
264b0 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
264c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
264d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
264e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
264f0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
26500 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
26510 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
26520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26530 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
26540 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
26550 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
26560 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
26570 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
26580 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
26590 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
265a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
265b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
265c0 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
265d0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
265e0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
26600 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
26610 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
26620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
26630 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26640 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26650 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26660 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
26670 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
26680 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266a0 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
266b0 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
266c0 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
266d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
266e0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
266f0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
26700 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
26710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
26720 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
26740 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26750 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
26760 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
26770 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
26780 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
26790 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
267a0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
267b0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
267c0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
267d0 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
267e0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
267f0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
26800 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
26810 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
26820 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
26830 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
26840 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26850 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
26860 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
26870 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
26880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26890 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
268a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
268b0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
268c0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
268d0 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
26900 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
26910 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
26920 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
26930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26940 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
26950 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
26960 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
26970 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26980 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
26990 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bName, zName);. 
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
269b0 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d  ToFree = zColnam
269c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
269d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
269e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
269f0 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
26a00 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
26a10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
26a20 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
26a30 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
26a40 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  e, pNew, pExpr);
26a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
26a60 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61  lname.z = zColna
26a70 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26a80 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c  sColname.n = sql
26a90 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
26aa0 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
26ab0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
26ac0 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
26ad0 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
26ae0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
26af0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
26b00 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
26b10 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
26b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26b30 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
26b40 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
26b50 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
26b60 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
26b70 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
26ba0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
26bb0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
26bc0 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
26bd0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
26be0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
26bf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
26c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c10 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
26c20 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
26c30 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
26c40 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
26c80 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
26c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26ca0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
26cb0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
26cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26cd0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
26ce0 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
26cf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
26d10 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
26d20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
26d30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26d40 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
26d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26d60 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
26d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26d80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26d90 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
26da0 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
26db0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26dc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26dd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26de0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
26df0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
26e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26e20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26e30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
26e40 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
26e50 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
26e60 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
26e70 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
26e80 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
26e90 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
26ea0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
26eb0 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
26ec0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26ed0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
26ee0 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
26ef0 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
26f00 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26f10 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
26f20 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
26f30 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
26f40 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
26f50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
26f60 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
26f70 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
26f80 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
26f90 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
26fa0 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
26fb0 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
26fc0 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
26fd0 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
26fe0 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
26ff0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
27000 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
27010 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
27020 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
27030 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
27040 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
27050 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
27060 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
27070 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
27080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27090 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
270a0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
270b0 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
270c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
270d0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
270e0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
270f0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
27100 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
27110 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
27120 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27130 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
27140 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
27150 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
27160 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
27170 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
27180 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
27190 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
271a0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
271b0 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
271c0 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
271d0 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
271e0 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
271f0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
27200 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
27210 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
27220 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27230 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
27240 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
27250 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
27260 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
27270 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
27280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
27290 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
272a0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
272b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
272c0 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
272d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
272e0 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
272f0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
27300 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
27310 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
27320 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
27330 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
27340 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
27350 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
27360 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
27370 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
27380 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
27390 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
273a0 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
273b0 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
273c0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
273d0 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
273e0 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
273f0 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
27400 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
27410 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
27420 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
27430 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27440 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
27450 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
27460 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
27470 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
27480 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  if( (pSelect->se
27490 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
274a0 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20  iValue)==0 ){.  
274b0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
274c0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
274d0 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  With;.  }.  sqli
274e0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
274f0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
27500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27510 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
27520 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
27530 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
27540 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
27550 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
27560 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
27570 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
27580 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
27590 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
275a0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
275b0 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
275c0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
275d0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
275e0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
275f0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
27600 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
27610 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
27620 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
27630 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
27640 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
27650 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
27660 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
27670 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
27680 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
27690 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
276a0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
276b0 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
276c0 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
276d0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
276e0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
276f0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
27700 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
27710 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
27720 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
27730 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
27740 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
27750 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
27760 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
27770 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
27780 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
27790 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
277a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
277b0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
277c0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
277d0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
277e0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
277f0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
27800 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
27810 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
27820 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
27830 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
27840 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
27850 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
27860 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
27870 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
27880 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
27890 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
278a0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
278b0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
278c0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
278d0 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
278e0 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
278f0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
27900 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
27910 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
27920 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
27930 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
27940 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
27950 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
27960 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
27970 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
27980 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
27990 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
279a0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
279b0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  or;.          se
279c0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
279d0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
279e0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
279f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27a00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
27a10 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
27a20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
27a30 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
27a40 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27a50 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
27a60 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
27a70 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
27a80 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
27a90 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
27aa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
27ab0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
27ac0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
27ad0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
27ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
27af0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
27b00 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
27b10 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
27b20 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
27b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
27b40 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
27b50 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
27b60 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
27b70 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27b80 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
27b90 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
27ba0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
27bb0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
27bc0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
27bd0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
27be0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
27bf0 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
27c00 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27c10 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
27c20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27c30 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
27c40 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
27c50 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
27c60 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
27c70 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
27c80 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
27c90 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
27ca0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
27cb0 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
27cc0 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
27cd0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
27ce0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
27cf0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
27d00 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
27d10 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
27d20 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
27d30 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
27d40 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
27d50 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
27d60 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
27d70 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
27d80 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
27d90 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
27da0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
27db0 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
27dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
27dd0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
27de0 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
27df0 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
27e00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27e10 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
27e20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
27e30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
27e40 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
27e50 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27e60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
27e70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27e80 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
27e90 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
27ea0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
27eb0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
27ec0 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
27ed0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
27ee0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
27ef0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
27f00 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
27f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27f20 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
27f30 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
27f40 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
27f50 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
27f60 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
27f70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
27f80 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
27f90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27fa0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
27fb0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
27fc0 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
27fd0 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
27fe0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
27ff0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28000 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
28010 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
28020 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
28030 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
28040 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
28050 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
28060 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
28070 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
28080 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
28090 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
280a0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
280b0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
280c0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
280d0 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
280e0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
280f0 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
28100 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
28110 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
28120 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
28130 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
28140 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
28150 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
28160 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
28170 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
28180 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
28190 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
281a0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
281b0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
281c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
281d0 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
281e0 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
281f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
28200 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28210 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
28220 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
28230 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
28240 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
28250 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
28260 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
28270 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
28280 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
28290 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
282a0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
282b0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
282c0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
282d0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
282e0 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
282f0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
28300 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
28310 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
28320 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
28330 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
28340 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
28350 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
28360 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
28370 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
28380 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
28390 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
283a0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
283b0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
283c0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
283d0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
283e0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
283f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
28400 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
28410 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
28420 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
28430 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
28440 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
28450 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
28460 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
28470 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
28480 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
28490 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
284a0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
284b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
284c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
284d0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
284e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
284f0 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
28500 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
28510 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
28520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28530 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
28540 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
28550 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
28560 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
28570 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
28580 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
28590 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
285a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
285b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
285c0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
285d0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
285e0 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
285f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28600 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
28610 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
28620 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
28630 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
28660 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
28670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28680 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
28690 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
286a0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
286b0 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
286c0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
286d0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
286e0 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
286f0 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
28700 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
28710 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
28720 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
28730 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28740 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
28750 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
28760 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
28770 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
28780 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
28790 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
287a0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
287b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
287c0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
287d0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
287e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
287f0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
28800 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
28810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28820 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
28830 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
28840 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
28850 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
28880 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
28890 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
288a0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
288b0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
288c0 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
288d0 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
288e0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
288f0 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
28900 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
28910 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
28920 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
28930 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
28940 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28950 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28960 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
28970 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
28980 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
28990 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
289a0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
289b0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
289c0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
289d0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
289e0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
289f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
28a00 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28a10 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
28a20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
28a30 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
28a40 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
28a50 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
28a60 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
28a70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
28a80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28a90 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
28aa0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28ab0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
28ac0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
28ad0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
28ae0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
28af0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
28b00 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
28b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
28b20 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
28b30 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
28b40 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43  egAgg, SQLITE_EC
28b50 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
28b60 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
28b70 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
28b80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
28b90 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
28ba0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
28bb0 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
28bc0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
28bd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28be0 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
28bf0 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
28c00 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
28c10 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
28c20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
28c30 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
28c40 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
28c50 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
28c60 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
28c70 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
28c80 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
28c90 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
28ca0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
28cb0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
28cc0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
28cd0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
28ce0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
28cf0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
28d00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
28d10 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
28d20 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
28d30 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
28d40 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
28d50 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
28d60 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
28d70 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
28d80 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
28d90 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
28da0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
28db0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
28dc0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
28dd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
28de0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
28df0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
28e00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
28e10 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
28e20 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
28e30 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
28e40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
28e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28e60 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
28e70 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
28e80 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
28e90 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
28ea0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28eb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28ec0 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
28ed0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
28f00 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
28f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28f20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
28f30 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
28f40 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
28f50 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
28f60 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
28f70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
28f80 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
28f90 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
28fa0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
28fb0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
28fc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28fd0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
28fe0 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
28ff0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
29000 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
29010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
29020 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
29030 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
29040 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
29050 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
29060 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
29070 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
29080 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
29090 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
290a0 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
290b0 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
290c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
290d0 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
290e0 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
290f0 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
29100 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
29110 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
29120 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
29130 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
29140 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
29150 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
29160 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
29170 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
29180 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
29190 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
291a0 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
291b0 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
291c0 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
291d0 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
291e0 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
291f0 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
29200 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
29210 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
29220 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
29230 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
29240 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
29250 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
29260 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
29270 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
29280 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
29290 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
292a0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
292b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
292c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
292d0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
292e0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
292f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
29300 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
29310 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
29320 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
29330 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
29340 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
29350 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
29360 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
29370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
29380 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
29390 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
293a0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
293b0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
293c0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
293d0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
293e0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
293f0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
29400 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
29410 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
29420 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29430 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
29440 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
29450 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
29460 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
29470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29480 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
29490 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294b0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
294c0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
294d0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294f0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
29500 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
29510 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
29520 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
29530 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
29540 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
29550 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
29560 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
29570 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
29580 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
29590 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
295a0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
295b0 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
295c0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
295d0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
295e0 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
295f0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
29600 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
29610 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
29620 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
29630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29640 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
29650 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
29660 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
29670 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
29680 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
29690 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
296a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
296b0 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
296c0 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
296d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
296e0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
296f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29700 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
29710 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
29720 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
29730 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
29740 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
29750 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
29760 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
29770 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
29780 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
29790 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
297a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
297b0 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
297c0 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
297d0 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
297e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
297f0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
29800 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29810 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
29820 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
29830 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29840 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
29850 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
29860 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
29870 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
29880 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
29890 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
298a0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
298b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
298c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
298d0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
298e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
298f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29900 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29910 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
29920 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
29930 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
29940 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
29950 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
29960 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
29970 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
29980 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29990 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
299a0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
299b0 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
299c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
299d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
299f0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
29a00 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
29a10 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
29a20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
29a30 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
29a40 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
29a50 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
29a60 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
29a70 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
29a80 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
29a90 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
29aa0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
29ab0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
29ac0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
29ad0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
29ae0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
29af0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
29b00 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29b10 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
29b20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
29b30 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
29b40 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29b50 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
29b60 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
29b70 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
29b80 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29b90 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
29ba0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
29bb0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
29bc0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
29bd0 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
29be0 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
29bf0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
29c00 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
29c10 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
29c20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20   SortCtx sSort; 
29c30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
29c40 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
29c50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
29c60 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  se */.  AggInfo 
29c70 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
29c80 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
29c90 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
29ca0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
29cb0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
29cc0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29cd0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
29ce0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
29cf0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
29d00 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
29d10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
29d20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29d30 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
29d40 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
29d50 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
29d60 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
29d70 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
29d80 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29d90 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
29da0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
29db0 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
29dc0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29dd0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
29de0 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
29df0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
29e00 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
29e10 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
29e20 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
29e30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
29e40 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
29e50 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
29e60 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
29e70 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
29e80 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
29e90 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54  dent++;.  SELECT
29ea0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
29eb0 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
29ec0 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66  sing:\n"));.  if
29ed0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
29ee0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
29ef0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
29f00 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
29f10 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
29f20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
29f30 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
29f40 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
29f50 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
29f60 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
29f70 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
29f80 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
29f90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
29fa0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
29fb0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
29fc0 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
29fd0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29fe0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
29ff0 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
2a000 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
2a010 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2a020 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
2a030 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2a040 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
2a050 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
2a060 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
2a070 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a080 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
2a090 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2a0a0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
2a0b0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2a0c0 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
2a0d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a0e0 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
2a0f0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2a100 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2a110 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
2a120 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
2a130 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
2a140 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
2a150 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
2a160 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
2a170 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
2a180 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
2a190 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
2a1a0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
2a1b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2a1c0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
2a1d0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
2a1e0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
2a1f0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2a200 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
2a210 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2a220 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
2a230 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
2a240 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
2a250 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
2a260 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2a270 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
2a280 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
2a290 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
2a2a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a2b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2a2c0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
2a2d0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
2a2e0 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20  =0 );.  isAgg = 
2a2f0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2a300 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2a310 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2a320 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2a330 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2a340 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2a350 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2a360 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  00,pParse,p, ("a
2a370 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2a380 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2a390 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2a3a0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2a3b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f    }.#endif...  /
2a3c0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
2a3d0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
2a3e0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
2a3f0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
2a400 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
2a410 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
2a420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2a430 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
2a440 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
2a450 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
2a460 65 2c 20 70 44 65 73 74 2c 20 70 2d 3e 70 45 4c  e, pDest, p->pEL
2a470 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
2a480 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2a490 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
2a4a0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74    /* Try to flat
2a4b0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
2a4c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a4d0 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
2a4e0 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
2a4f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2a500 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2a510 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2a520 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2a530 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
2a540 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
2a550 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2a560 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2a570 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2a580 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2a590 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2a5a0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2a5b0 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
2a5c0 67 67 53 75 62 3b 0a 20 20 20 20 69 66 28 20 70  ggSub;.    if( p
2a5d0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2a5e0 65 3b 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  e;.    isAggSub 
2a5f0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2a600 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2a610 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2a620 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2a630 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2a640 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2a650 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2a660 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2a670 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2a680 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2a690 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2a6a0 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2a6b0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2a6c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2a6d0 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2a6e0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2a6f0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2a700 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2a710 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2a720 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2a730 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2a740 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2a750 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2a760 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2a770 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2a780 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2a790 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2a7a0 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2a7b0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2a7c0 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2a7d0 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2a7e0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2a7f0 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2a800 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2a810 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2a820 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2a830 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e  elect_end;..#ifn
2a840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a850 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2a860 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
2a870 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
2a880 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
2a890 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
2a8a0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
2a8b0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
2a8c0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
2a8d0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
2a8e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
2a8f0 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c  pDest);.    expl
2a900 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
2a910 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2a920 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2a930 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  d);.#if SELECTTR
2a940 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2a950 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
2a960 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
2a970 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
2a980 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
2a990 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2a9a0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
2a9b0 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  f.    return rc;
2a9c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2a9d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2a9e0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2a9f0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2aa00 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
2aa10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2aa20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2aa30 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2aa40 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
2aa50 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2aa60 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2aa70 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2aa80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2aa90 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2aaa0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2aab0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2aac0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2aad0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2aae0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2aaf0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2ab00 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2ab10 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2ab20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2ab30 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2ab40 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2ab50 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2ab60 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2ab70 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2ab80 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2ab90 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2aba0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2abb0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2abc0 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2abd0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2abe0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2abf0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2ac00 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2ac10 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2ac20 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2ac30 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2ac40 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2ac50 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2ac60 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2ac70 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2ac80 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2ac90 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2aca0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2acb0 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
2acc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2acd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ace0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
2acf0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
2ad00 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2ad10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ad20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2ad30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
2ad40 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
2ad50 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
2ad60 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
2ad70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
2ad80 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
2ad90 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
2ada0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
2adb0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
2adc0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
2add0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2ade0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
2adf0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
2ae00 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
2ae10 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
2ae20 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
2ae30 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
2ae40 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
2ae50 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
2ae60 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
2ae70 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
2ae80 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
2ae90 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
2aea0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
2aeb0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2aec0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
2aed0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
2aee0 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
2aef0 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
2af00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
2af10 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
2af20 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
2af30 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
2af40 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
2af50 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
2af60 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2af70 66 28 20 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  f( (pItem->joint
2af80 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d  ype & JT_OUTER)=
2af90 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  =0.     && pushD
2afa0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 64 62  ownWhereTerms(db
2afb0 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
2afc0 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
2afd0 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  r).    ){.#if SE
2afe0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2aff0 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
2b000 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2b010 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
2b020 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2b030 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
2b040 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
2b050 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29  e push-down:\n")
2b060 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b070 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2b080 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
2b090 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2b0a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2b0b0 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
2b0c0 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  nt the subquery.
2b0d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2b0e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
2b0f0 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
2b100 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d  Flags & SF_All)=
2b110 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
2b120 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2b130 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  b, SQLITE_SubqCo
2b140 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a  routine).    ){.
2b150 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2b160 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2b170 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2b180 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2b190 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2b1a0 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2b1b0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2b1c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2b1d0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2b1e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b1f0 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
2b200 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2b210 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2b220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b230 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2b240 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2b250 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2b260 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2b270 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b280 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2b290 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2b2a0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2b2b0 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2b2c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2b2d0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2b2e0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2b2f0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2b300 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2b310 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2b320 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2b330 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2b340 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2b350 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b360 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2b370 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2b380 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2b390 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  gEst = sqlite3Lo
2b3a0 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65  gEst(pSub->nSele
2b3b0 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49  ctRow);.      pI
2b3c0 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
2b3d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2b3e0 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2b3f0 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2b400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b410 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
2b420 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2b430 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2b440 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2b450 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
2b460 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b470 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2b480 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2b490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2b4a0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2b4b0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2b4c0 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
2b4d0 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
2b4e0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
2b4f0 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
2b500 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
2b510 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
2b520 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
2b530 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2b540 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
2b550 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
2b560 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
2b570 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
2b580 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
2b590 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
2b5a0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
2b5b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b5c0 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
2b5d0 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
2b5e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
2b5f0 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
2b600 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
2b610 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
2b620 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2b630 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2b640 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
2b650 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
2b660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b670 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
2b680 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2b690 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2b6a0 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
2b6b0 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r+1;.      if( p
2b6c0 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
2b6d0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
2b6e0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
2b6f0 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
2b700 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
2b710 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
2b720 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
2b730 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
2b740 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
2b750 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
2b760 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
2b770 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2b780 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
2b790 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
2b7a0 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
2b7b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2b7c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2b7d0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2b7e0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2b7f0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2b800 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2b810 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
2b820 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
2b830 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2b840 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2b850 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2b860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2b870 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
2b880 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
2b890 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2b8a0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2b8b0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2b8c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2b8d0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2b8e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2b8f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2b900 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2b910 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2b920 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2b930 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2b940 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
2b950 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  w);.      if( on
2b960 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2b970 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2b980 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2b990 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2b9a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2b9b0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2b9c0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2b9d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b9e0 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
2b9f0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2ba00 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2ba10 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2ba20 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
2ba30 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2ba40 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2ba50 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2ba60 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
2ba70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2ba80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2ba90 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2baa0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
2bab0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2bac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2bad0 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
2bae0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2baf0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
2bb00 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
2bb10 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
2bb20 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
2bb30 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
2bb40 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
2bb50 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
2bb60 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
2bb70 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
2bb80 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
2bb90 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
2bba0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2bbb0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
2bbc0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2bbd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2bbe0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2bbf0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2bc00 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2bc10 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
2bc20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
2bc30 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
2bc40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2bc50 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2bc60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2bc70 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2bc80 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2bc90 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2bca0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2bcb0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2bcc0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2bcd0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2bce0 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2bcf0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2bd00 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2bd10 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2bd20 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2bd30 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2bd40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2bd50 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2bd60 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2bd70 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2bd80 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2bd90 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2bda0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2bdb0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2bdc0 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2bdd0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2bde0 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2bdf0 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2be00 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2be10 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2be20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2be30 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2be40 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2be50 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2be60 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2be70 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2be80 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2be90 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2bea0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2beb0 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2bec0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2bed0 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2bee0 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2bef0 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2bf00 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2bf10 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2bf20 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2bf30 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2bf40 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2bf50 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2bf60 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45  ort.pOrderBy, pE
2bf70 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
2bf80 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
2bf90 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2bfa0 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  t;.    pGroupBy 
2bfb0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  = p->pGroupBy = 
2bfc0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2bfd0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
2bfe0 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  );.    /* Notice
2bff0 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
2c000 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
2c010 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
2c020 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
2c030 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
2c040 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
2c050 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
2c060 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
2c070 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
2c080 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
2c090 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
2c0a0 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
2c0b0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
2c0c0 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
2c0d0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2c0e0 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
2c0f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2c100 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2c110 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
2c120 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
2c130 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
2c140 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
2c150 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
2c160 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
2c170 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
2c180 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
2c190 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
2c1a0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
2c1b0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
2c1c0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2c1d0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
2c1e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2c1f0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2c200 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
2c210 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
2c220 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
2c230 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2c240 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
2c250 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
2c260 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c270 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
2c280 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
2c290 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
2c2a0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
2c2b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2c2c0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
2c2d0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
2c2e0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2c2f0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2c300 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
2c310 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
2c320 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
2c330 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
2c340 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2c350 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c360 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
2c370 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2c380 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2c390 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
2c3a0 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
2c3b0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
2c3c0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
2c3d0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
2c3e0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2c3f0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
2c400 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2c410 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
2c420 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
2c430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
2c440 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
2c450 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
2c460 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
2c470 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
2c480 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
2c490 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
2c4a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2c4b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
2c4c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
2c4d0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
2c4e0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
2c4f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
2c500 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
2c510 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2c520 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2c530 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2c540 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
2c550 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
2c560 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
2c570 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
2c580 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
2c590 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2c5a0 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
2c5b0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2c5c0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2c5d0 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d  Index)->opcode =
2c5e0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a   OP_SorterOpen;.
2c5f0 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c      sSort.sortFl
2c600 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f  ags |= SORTFLAG_
2c610 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a  UseSorter;.  }..
2c620 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68    /* Open an eph
2c630 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20  emeral index to 
2c640 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
2c650 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
2c660 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2c670 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
2c680 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2c690 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
2c6a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
2c6b0 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
2c6c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2c6d0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2c6e0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c700 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74         sDistinct
2c710 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a  .tabTnct, 0, 0,.
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2c740 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
2c750 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2c760 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
2c790 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
2c7a0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2c7b0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
2c7c0 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
2c7d0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2c7e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2c7f0 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
2c800 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
2c810 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2c820 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
2c830 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
2c840 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
2c850 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
2c860 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2c870 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
2c880 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
2c890 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
2c8a0 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
2c8b0 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
2c8c0 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
2c8d0 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
2c8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2c8f0 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
2c900 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2c910 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2c920 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
2c930 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
2c960 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
2c970 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ags, 0);.    if(
2c980 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2c990 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2c9a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2c9b0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2c9c0 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
2c9d0 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
2c9e0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2c9f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
2ca00 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2ca10 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2ca20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
2ca30 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
2ca40 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
2ca50 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
2ca60 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2ca70 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
2ca80 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2ca90 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2caa0 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2cab0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
2cac0 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
2cad0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2cae0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2caf0 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
2cb00 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
2cb10 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2cb20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2cb30 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
2cb40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2cb50 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
2cb60 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
2cb70 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
2cb80 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
2cb90 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
2cba0 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
2cbb0 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
2cbc0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
2cbd0 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
2cbe0 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
2cbf0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
2cc00 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
2cc10 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
2cc20 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
2cc30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2cc40 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2cc50 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2cc60 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
2cc70 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
2cc80 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
2cc90 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
2cca0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
2ccb0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c  , p, pEList, -1,
2ccc0 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
2ccd0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccf0 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
2cd00 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
2cd10 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2cd20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2cd30 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2cd40 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
2cd50 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
2cd60 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
2cd70 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
2cd80 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2cd90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2cda0 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
2cdb0 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
2cdc0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
2cdd0 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2cde0 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
2cdf0 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
2ce00 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
2ce10 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2ce20 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
2ce30 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2ce40 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
2ce50 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2ce60 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2ce70 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
2ce80 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2ce90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
2cea0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2ceb0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2cec0 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
2ced0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2cee0 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
2cef0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2cf00 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
2cf10 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
2cf20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2cf40 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
2cf50 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
2cf60 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
2cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cf80 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
2cf90 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
2cfa0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
2cfb0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2cfc0 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
2cfd0 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
2cfe0 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
2cff0 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
2d000 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
2d010 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
2d020 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
2d030 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
2d040 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2d050 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
2d060 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
2d070 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
2d080 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
2d090 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
2d0a0 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
2d0b0 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
2d0c0 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
2d0d0 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
2d0e0 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
2d0f0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
2d100 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
2d110 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
2d120 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
2d130 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
2d140 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
2d150 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
2d160 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
2d170 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2d180 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
2d190 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2d1a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2d1b0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
2d1c0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
2d1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d1e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2d1f0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2d200 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2d210 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2d220 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
2d230 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
2d240 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
2d250 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
2d260 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
2d270 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
2d280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
2d290 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
2d2a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2d2b0 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
2d2c0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2d2d0 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
2d2e0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2d2f0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2d300 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2d310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2d320 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31   p->nSelectRow>1
2d330 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  00 ) p->nSelectR
2d340 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65  ow = 100;.    }e
2d350 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  lse{.      p->nS
2d360 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20  electRow = 1;.  
2d370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2d380 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
2d390 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
2d3a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2d3b0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
2d3c0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
2d3d0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
2d3e0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
2d3f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2d400 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
2d410 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
2d420 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
2d430 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
2d440 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
2d450 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
2d460 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
2d470 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
2d480 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
2d490 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
2d4a0 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
2d4b0 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
2d4c0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
2d4d0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
2d4e0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
2d4f0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
2d500 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
2d510 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
2d520 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
2d530 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
2d540 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
2d550 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
2d560 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
2d570 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
2d580 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
2d590 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
2d5a0 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
2d5b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2d5c0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
2d5d0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
2d5e0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
2d5f0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
2d600 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
2d610 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
2d620 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
2d630 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
2d640 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2d650 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
2d660 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
2d670 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
2d680 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
2d690 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
2d6a0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
2d6b0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
2d6c0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
2d6d0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
2d6e0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
2d6f0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
2d700 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
2d710 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
2d720 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
2d730 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
2d740 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
2d750 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
2d760 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
2d770 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
2d780 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
2d790 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
2d7a0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2d7b0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
2d7c0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
2d7d0 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
2d7e0 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
2d7f0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
2d800 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2d810 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
2d820 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2d830 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2d840 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
2d850 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
2d860 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
2d870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2d880 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2d890 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
2d8a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2d8b0 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
2d8c0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
2d8d0 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
2d8e0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
2d8f0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
2d900 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2d910 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
2d920 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2d930 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2d940 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2d950 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
2d960 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
2d970 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2d980 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
2d990 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2d9a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2d9b0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2d9c0 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
2d9d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
2d9e0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
2d9f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2da00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2da10 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2da20 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
2da30 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
2da40 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
2da50 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
2da60 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
2da70 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
2da80 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
2da90 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
2daa0 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
2dab0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2dac0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
2dad0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
2dae0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
2daf0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
2db00 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
2db10 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
2db20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
2db30 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
2db40 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
2db50 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
2db60 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
2db70 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2db80 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
2db90 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
2dba0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
2dbb0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2dbc0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2dbd0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2dbe0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2dbf0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
2dc00 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
2dc10 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
2dc20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2dc30 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
2dc40 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
2dc50 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
2dc60 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
2dc70 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
2dc80 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
2dc90 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2dca0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2dcb0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
2dcc0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
2dcd0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
2dce0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
2dcf0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
2dd00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2dd10 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2dd20 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
2dd30 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
2dd40 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2dd50 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2dd60 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
2dd70 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
2dd80 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
2dd90 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
2dda0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
2ddb0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
2ddc0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
2ddd0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2dde0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
2ddf0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
2de00 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
2de10 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
2de20 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
2de30 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
2de40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2de50 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2de60 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
2de70 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
2de80 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2de90 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2dea0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73  , pGroupBy, 0, s
2deb0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
2dec0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2ded0 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2dee0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2def0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2df00 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2df10 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2df20 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2df30 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2df40 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2df50 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2df60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2df70 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2df80 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2df90 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2dfa0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2dfb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2dfc0 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2dfd0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2dfe0 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2dff0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e000 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2e010 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e020 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2e030 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2e040 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2e050 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2e060 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2e070 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2e080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2e090 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2e0a0 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2e0b0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2e0c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2e0d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e0e0 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2e0f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2e100 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2e110 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2e120 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2e130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e140 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e150 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2e160 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e170 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2e180 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2e190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e1a0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2e1b0 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2e1c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2e1d0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2e1e0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2e1f0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2e200 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2e210 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2e220 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2e230 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2e240 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2e250 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2e260 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2e270 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2e280 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2e290 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2e2a0 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2e2b0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2e2c0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2e2d0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2e2e0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2e2f0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2e300 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2e310 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2e320 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2e330 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2e340 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2e350 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e370 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2e380 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2e390 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2e3a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2e3b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2e3c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2e3d0 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2e3e0 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2e3f0 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2e400 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2e410 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2e420 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2e430 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2e440 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2e450 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e460 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2e470 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2e480 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2e490 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2e4a0 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2e4b0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2e4c0 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2e4d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2e4e0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2e4f0 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2e500 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2e510 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2e520 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2e530 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2e540 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2e550 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2e560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e570 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2e580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2e590 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2e5a0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2e5b0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2e5c0 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2e5d0 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2e5e0 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2e5f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2e600 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2e610 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2e620 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2e630 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2e640 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2e650 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2e660 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2e670 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2e680 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2e690 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2e6a0 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2e6b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2e6c0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2e6d0 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2e6e0 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2e6f0 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2e700 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2e710 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2e720 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2e730 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e750 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2e760 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2e770 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2e780 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2e790 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2e7a0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2e7b0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2e7c0 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  y;.        j = n
2e7d0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
2e7e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2e7f0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2e800 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2e810 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2e820 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2e830 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2e840 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2e850 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2e860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e870 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2e880 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2e890 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2e8a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2e8b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2e8c0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2e8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e8e0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2e8f0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2e900 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2e910 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2e920 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
2e930 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2e940 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2e950 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2e960 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
2e970 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f   = &sAggInfo.aCo
2e980 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
2e990 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
2e9a0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2e9b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31            int r1
2e9c0 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a   = j + regBase;.
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2e9e0 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  r2;..           
2e9f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
2ea00 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
2ea10 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea30 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
2ea40 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
2ea50 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
2ea60 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
2ea70 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
2ea80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ea90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eaa0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
2eab0 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
2eac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ead0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
2eae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2eaf0 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
2eb00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2eb10 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
2eb20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2eb30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2eb40 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
2eb50 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
2eb60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2eb70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2eb80 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
2eb90 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2eba0 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
2ebb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ebc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2ebd0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
2ebe0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2ebf0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2ec00 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
2ec10 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
2ec20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2ec30 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2ec40 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2ec50 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
2ec60 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
2ec70 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2ec80 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
2ec90 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
2eca0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2ecb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2ecc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2ecd0 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
2ece0 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
2ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ed10 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
2ed20 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2ed30 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
2ed40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ed50 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
2ed60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2ed70 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
2ed80 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
2ed90 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
2eda0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2edb0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
2edc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2edd0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
2ede0 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2edf0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
2ee00 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
2ee10 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
2ee20 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
2ee30 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
2ee40 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
2ee50 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
2ee60 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
2ee70 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
2ee80 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
2ee90 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
2eea0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
2eeb0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2eec0 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
2eed0 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
2eee0 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
2eef0 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
2ef00 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2ef10 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
2ef20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2ef30 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
2ef40 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
2ef50 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
2ef60 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
2ef70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
2ef80 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
2ef90 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2efa0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2efb0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
2efc0 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
2efd0 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
2efe0 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
2eff0 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
2f000 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2f010 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2f020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f030 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2f040 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2f050 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
2f060 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2f070 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2f080 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2f090 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2f0a0 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2f0b0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2f0c0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2f0d0 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2f0e0 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2f0f0 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2f100 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2f110 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2f120 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2f130 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2f140 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2f150 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2f160 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2f170 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2f180 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2f190 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2f1a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f1b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f1c0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2f1d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2f1e0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2f1f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f200 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2f210 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2f220 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2f230 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
2f240 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72               sor
2f250 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b  tOut, sortPTab);
2f260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2f270 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
2f280 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
2f290 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
2f2a0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2f2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f2c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2f2d0 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
2f2e0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
2f2f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f300 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
2f310 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2f320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f330 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2f340 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
2f350 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
2f360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f370 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2f380 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2f390 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
2f3a0 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
2f3b0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
2f3e0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
2f3f0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
2f400 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
2f410 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f420 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f440 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
2f450 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64  +1, 0, j1+1); Vd
2f460 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
2f470 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f480 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2f490 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2f4a0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2f4b0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2f4c0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2f4d0 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2f4e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2f4f0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2f500 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2f510 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2f520 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2f530 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2f540 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2f550 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2f560 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2f570 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2f580 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2f590 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2f5a0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2f5b0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2f5c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2f5d0 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2f5e0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2f5f0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2f600 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2f610 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2f620 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2f630 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2f640 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2f650 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2f660 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2f670 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2f680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f690 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2f6a0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2f6b0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2f6c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f6d0 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2f6e0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2f6f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f700 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2f710 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
2f720 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f730 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f740 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
2f750 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2f760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f770 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2f780 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2f790 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
2f7a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2f7b0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2f7c0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2f7d0 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2f7e0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2f7f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2f800 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2f810 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2f820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f830 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f840 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
2f850 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2f860 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2f870 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2f880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f890 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2f8a0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2f8b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f8c0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2f8d0 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2f8e0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2f8f0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2f900 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2f910 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2f920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f930 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2f940 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
2f950 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2f960 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
2f970 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2f980 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f9a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2f9b0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2f9c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2f9d0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2f9e0 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2f9f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2fa00 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2fa10 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2fa20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2fa30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fa40 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2fa50 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2fa60 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2fa70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2fa80 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2fa90 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2faa0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2fab0 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2fac0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2fad0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fae0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
2faf0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2fb00 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2fb10 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2fb20 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2fb30 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2fb40 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2fb50 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2fb60 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2fb70 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2fb80 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2fb90 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2fba0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2fbb0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2fbc0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2fbd0 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2fbe0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2fbf0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2fc00 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2fc10 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2fc20 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2fc30 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2fc40 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2fc50 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2fc60 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2fc70 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2fc80 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2fc90 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2fca0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2fcb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2fcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fcd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2fce0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
2fcf0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2fd00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
2fd10 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
2fd20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2fd30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2fd40 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
2fd50 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
2fd60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2fd70 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
2fd80 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
2fd90 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2fda0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2fdb0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2fdc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2fdd0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
2fde0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
2fdf0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
2fe00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2fe10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2fe20 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
2fe30 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
2fe40 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
2fe50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2fe60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2fe70 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2fe80 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
2fe90 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2fea0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2feb0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2fec0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2fed0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
2fee0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
2fef0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2ff00 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
2ff10 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2ff20 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
2ff30 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff50 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2ff60 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2ff70 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
2ff80 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
2ff90 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
2ffa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ffb0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2ffc0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2ffd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ffe0 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
2fff0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
30000 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
30010 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
30020 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
30030 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
30040 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
30050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
30060 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
30070 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
30080 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
30090 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
300a0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
300b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
300c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
300d0 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
300e0 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
300f0 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
30100 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
30110 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
30120 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
30130 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
30140 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
30150 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
30160 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
30170 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
30180 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
30190 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
301a0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
301b0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
301c0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
301d0 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
301e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
301f0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
30200 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
30210 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
30220 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
30230 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
30240 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
30250 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
30260 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
30270 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
30280 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
30290 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
302a0 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
302b0 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
302c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
302d0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
302e0 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
302f0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
30300 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
30310 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
30320 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
30330 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
30340 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
30350 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
30360 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
30370 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
30380 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
30390 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
303a0 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
303b0 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
303c0 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
303d0 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
303e0 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
303f0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
30400 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
30410 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
30420 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
30430 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
30440 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
30450 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
30460 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
30470 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
30480 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
30490 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
304a0 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
304b0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
304c0 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
304d0 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
304e0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30500 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
30510 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
30520 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
30530 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
30540 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
30550 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
30560 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
30570 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
30580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30590 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
305a0 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
305b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
305c0 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
305d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
305e0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
305f0 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
30600 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
30610 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
30620 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
30630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30640 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
30650 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
30660 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
30670 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
30680 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
30690 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
306a0 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
306b0 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
306c0 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
306d0 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
306e0 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
306f0 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
30700 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30710 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
30720 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
30730 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
30740 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
30750 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
30760 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
30770 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
30780 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
30790 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
307a0 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
307b0 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
307c0 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
307d0 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
307e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
307f0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
30800 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
30810 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
30820 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
30830 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
30840 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
30850 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
30860 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
30870 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
30880 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
30890 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
308a0 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
308b0 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
308c0 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
308d0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
308e0 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
308f0 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
30900 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
30910 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
30920 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
30930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
30950 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
30960 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
30970 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
30980 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
30990 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
309a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
309b0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
309c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
309d0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
309e0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
309f0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
30a00 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
30a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
30a20 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
30a30 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
30a40 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
30a50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
30a60 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
30a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30a80 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
30a90 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
30aa0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
30ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30ad0 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
30ae0 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
30af0 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
30b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30b10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
30b20 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
30b30 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
30b40 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
30b50 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
30b60 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
30b70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30b80 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
30b90 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
30ba0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
30bb0 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
30bc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
30bd0 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
30be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
30bf0 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
30c00 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
30c10 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
30c20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
30c30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
30c40 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
30c50 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
30c60 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
30c70 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
30c80 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
30c90 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
30ca0 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
30cb0 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
30cc0 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
30cd0 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
30ce0 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
30cf0 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
30d00 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
30d10 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
30d20 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
30d30 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
30d40 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
30d50 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
30d60 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
30d70 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
30d80 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
30d90 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
30da0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
30db0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
30dc0 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
30dd0 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
30de0 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
30df0 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
30e00 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
30e10 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
30e20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30e30 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
30e40 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
30e50 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
30e60 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
30e70 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
30e80 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
30e90 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
30ea0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30eb0 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
30ec0 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
30ed0 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
30ee0 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
30ef0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
30f00 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
30f10 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
30f20 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
30f30 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
30f40 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
30f50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30f60 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
30f70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
30f80 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
30f90 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
30fa0 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
30fb0 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
30fc0 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
30fd0 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
30fe0 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
30ff0 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
31000 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
31010 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
31020 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
31030 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
31040 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
31050 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
31060 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
31070 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
31080 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31090 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
310a0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
310b0 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
310c0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
310d0 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
310e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
310f0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
31100 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31110 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
31120 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
31130 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
31140 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
31150 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
31160 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
31170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
31180 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
31190 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
311a0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
311b0 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
311c0 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
311d0 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
311e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
311f0 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
31200 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
31210 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
31220 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
31230 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
31240 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
31250 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
31260 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
31270 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
31280 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
31290 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
312a0 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
312b0 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
312c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
312d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
312e0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
312f0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
31300 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
31310 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
31320 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
31330 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
31340 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
31350 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
31360 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
31370 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
31380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31390 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
313a0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
313b0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
313c0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
313d0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
313e0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
313f0 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67  , pMinMax,0,flag
31400 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
31410 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
31420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31430 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
31440 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
31450 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
31460 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
31470 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
31480 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
31490 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
314a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
314b0 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
314c0 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
314d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
314e0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
314f0 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
31500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
31510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31520 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33  Goto, 0, sqlite3
31530 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
31540 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
31550 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
31560 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
31570 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
31580 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
31590 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
315a0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
315b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
315c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
315d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
315e0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
315f0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
31600 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31610 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
31620 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
31630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
31640 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
31650 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
31660 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
31670 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
31680 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
31690 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
316a0 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  -1, 0, 0, .     
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
316d0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
316e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
316f0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
31700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31710 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
31720 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
31730 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
31740 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
31750 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69  ry */..  if( sDi
31760 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
31770 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
31780 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20  _UNORDERED ){.  
31790 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
317a0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
317b0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
317c0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
317d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
317e0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
317f0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
31800 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
31810 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
31820 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
31830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
31840 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
31850 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
31860 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ble(pParse,.    
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20   sSort.nOBSat>0 
31890 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46  ? "RIGHT PART OF
318a0 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45   ORDER BY":"ORDE
318b0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
318c0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
318d0 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20  rse, p, &sSort, 
318e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
318f0 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
31900 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
31910 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
31920 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
31930 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
31940 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
31950 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
31960 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65   coded. If there
31970 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
31980 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
31990 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  ure,.  ** set th
319a0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
319b0 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e   1. Otherwise 0.
319c0 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72   */.  rc = (pPar
319d0 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20  se->nErr>0);..  
319e0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
319f0 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
31a00 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
31a10 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
31a20 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
31a30 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
31a40 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
31a50 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c  lect_end:.  expl
31a60 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
31a70 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
31a80 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
31a90 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  d);..  /* Identi
31aa0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
31ab0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
31ac0 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
31ad0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
31ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31af0 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
31b00 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
31b10 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
31b20 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
31b30 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
31b40 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
31b50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
31b60 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
31b70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
31b80 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
31b90 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
31ba0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
31bb0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
31bc0 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
31bd0 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
31be0 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
31bf0 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
31c00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.